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 |
| 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 |
| 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;注:
[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 |
| 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個漢字。
| PARAMETER | VALUE |
| NLS_CHARACTERSET | UTF8 |
6.2 nvarchar2存漢字
nvarchar2(6)表示該字段類型為nvarchar2,長度為6,不論英文,數字,中文都能存6個。本文基于字符集ZHS16GBK。
?附圖(插入異常):
| ID | NAME | BYTE_LEN | CHAR_LEN |
| 10 | 中國安徽合肥 | 12 | 6 |
| 12 | abcdef | 12 | 6 |
7?總結
暫無.有問題可以咨詢如下:
總結
以上是生活随笔為你收集整理的Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 糙米糊怎么做?
- 下一篇: Mysql select into ou