日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异

發布時間:2024/9/27 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1簡介... 1

2 準備... 1

2.1 環境說明... 1

3 安裝... 2

4 配置... 2

5 使用... 3

5.1 驗證實驗... 3

5.2 問題分析... 5

6 延展... 5

6.1 varchar2長度與字符集... 5

6.2 nvarchar2存漢字... 5

7 總結... 6

Mysql UTF8 varchar與Oracle ZHS16GBK varchar2同長度下的差異

1簡介

基于字符集UTF8的mysql數據庫下的varchar字段和字符集ZHS16GBK下oracle數據庫下同長度的varchar2下的在插入數據時是有差異的,特別是在有中文字段的情況下。具體原因見下文實驗以及分析。

2?準備

2.1?環境說明

1 mysql版本10.3.13-MariaDB,同理其它mysql版本效果類似。

-- 查看mysql版本 SELECT VERSION() AS mysql_Version;

mysql_Version

10.3.13-MariaDB

-- mysql 字符集 show variables like '%char%';

Variable_name

Value

character_set_client

utf8

character_set_connection

utf8

character_set_database

utf8

character_set_filesystem

binary

character_set_results

character_set_server

utf8

character_set_system

utf8

character_sets_dir

E:\Program Files\MariaDB 10.3\share\charsets\

2 oracle版本為11g R2,同理其它版本效果類似。

--查看數據庫版本 SELECT * FROM v$version;

BANNER

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

"CORE?? 11.2.0.4.0? Production"

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 - Production

--查看字符集 SELECT * FROM v$nls_parameters where parameter='NLS_CHARACTERSET';

PARAMETER

VALUE

NLS_CHARACTERSET

ZHS16GBK

3 安裝

無.

4?配置

5?使用

5.1?驗證實驗

1) mysql里創建一個demo表定義id和長度為6的name字段,插入中文數據驗證,這里最大的插入長度為6.

CREATE TABLE demo(id int,name varchar(6),PRIMARY KEY (id)) DEFAULT CHARSET=utf8;

注:

  • 如果character_set_database已經是utf8,那么這里建表時可以不加DEFAULT CHARSET=utf8.
  • 修改character_set_database參數可以在my.ini或者my.cnf里添加或者修改如下內容:
  • [client]

    default-character-set=utf8

    INSERT INTO demo VALUES(10,'中國'); INSERT INTO demo VALUES(11,'中國安徽合肥'); -- 插入失敗 Data too long for column 'name' at row 1 INSERT INTO demo VALUES(12,'中國安徽合肥市'); INSERT INTO demo VALUES(13,'abcdef'); -- 插入失敗 Data too long for column 'name' at row 1 INSERT INTO demo VALUES(14,'abcdefg'); -- 查看字段的字節、字符長度 SELECT *,length(name) byte_len,CHAR_LENGTH(name) char_len FROM demo;

    附圖(插入異常):

    id

    name

    len

    char_len

    10

    中國

    6

    2

    11

    中國安徽合肥

    18

    6

    13

    abcdef

    6

    6

    ???????

    注:

    LENGTH(str) :Returns the length of the string str, measured in bytes.以字節為測量單位。???

    CHAR_LENGTH(str):Returns the length of the string str, measured in characters.?以字符為測量單位。

    2) 同理在oracle里創建一個demo表定義id和長度為6的name字段,插入中文數據驗證,這里最大的插入長度為3(基于當前的oracle字符集環境).

    SELECT * FROM v$version;

    BARNER

    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

    PL/SQL Release 11.2.0.4.0 - Production

    "CORE? 11.2.0.4.0 Production"

    TNS for Linux: Version 11.2.0.4.0 - Production

    NLSRTL Version 11.2.0.4.0 – Production

    SELECT * FROM v$nls_parameters where parameter='NLS_CHARACTERSET';

    PARAMETER

    VALUE

    NLS_CHARACTERSET

    ZHS16GBu

    ID

    NAME

    BYTE_LEN

    CHAR_LEN

    10

    中國

    4

    2

    11

    中國家

    6

    3

    13

    abcdef

    6

    6

    5.2?問題分析

    6?延展

    6.1 varchar2長度與字符集

    varchar2最大是4000字節(byte),查看數據庫字符集的方法:

    select userenv('language')? from dual;

    USERENV('LANGUAGE')

    SIMPLIFIED CHINESE_CHINA.ZHS16GBK


    ?

    • 如果是ZHS16GBK即字符集是16位編碼的,那么每個字符16位(bit),2字節(byte),所以最大容納2000個漢字。
    • 如果是ZHS32GBK即字符集是32位編碼的,那么每個字符32位(bit),4字節(byte),所以最大容納1000個漢字。
    • 如果是字符集是UTF8或者AL32UTF8的,那么每個字符24位(bit),3字節(byte),所以最大容納4000/3=1333個漢字。
    SELECT * FROM v$nls_parameters WHERE PARAMETER='NLS_CHARACTERSET';

    PARAMETER

    VALUE

    NLS_CHARACTERSET

    UTF8

    6.2 nvarchar2存漢字


    nvarchar2(6)表示該字段類型為nvarchar2,長度為6,不論英文,數字,中文都能存6個。本文基于字符集ZHS16GBK

    CREATE TABLE demo2(id int,name nvarchar2(6),PRIMARY KEY (id)); INSERT INTO demo2 VALUES(10,'中國安徽合肥'); ---- 插入失敗,提示值太大 INSERT INTO demo2 VALUES(11,'中國安徽合肥1'); INSERT INTO demo2 VALUES(12,'abcdef'); ---- 插入失敗,提示值太大 INSERT INTO demo2 VALUES(13,'abcdefg'); -- 查看字段的字節、字符長度 SELECT A.*,lengthb(name) byte_len,length(name) char_len? FROM demo2 A;

    ?附圖(插入異常):

    ID

    NAME

    BYTE_LEN

    CHAR_LEN

    10

    中國安徽合肥

    12

    6

    12

    abcdef

    12

    6

    7?總結

    暫無.有問題可以咨詢如下:

    總結

    以上是生活随笔為你收集整理的Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。