知识背景:在oracle中 定义char 类型 一个中文占用2个字节,一个英文占用一个字节
例子1 create table nation_t (country char(10),text varchar2(20))
SQL> select length(country),country,length(text) from nation_T;
LENGTH(COUNTRY) COUNTRY LENGTH(TEXT)
--------------- -------------------- ------------
6 中国 6
10 ASDFWWEEWE 10
4 中国人 4
看到这个结果我晕了,,,,
’中国 ‘比'中国人 '还长?? 拷出来 中国+4个空格 中国人+1个空格 这是什么情况? 接受不了了
求解!!!!!!!!!怀疑是字符集的问题 查了下是AL32UTF8
例子2:换个数据库 ZHS16GBK
创建同样表,插入同样数据
SQL> SELECT length(country),country,length(text) from nation_T;
LENGTH(COUNTRY) COUNTRY LENGTH(TEXT)
--------------- ---------- ------------
8 中国 2
7 中国人 3
我彻底崩溃了。。。
我就瞎猜吧 这个长度难道是空格的长度??突然 看到希望:汉字虽然是用2个字节表示,但是长度还1是 得出:10-2*2=6 6+2=8 即是例子2的答案。
但是例子1如何解释??
一个汉字占3个字节??得出答案。
以前 看盖国强的书,他鼓励dba大胆猜想。我觉着靠谱。
通过猜想,貌似自己的答案无懈可击。
验证:
SQL> SELECT DUMP(COUNTRY),country FROM NATION_T;
DUMP(COUNTRY)
--------------------------------------------------------------------------------
COUNTRY
----------
Typ=96 Len=10: 214,208,185,250,32,32,32,32,32,32
中国
Typ=96 Len=10: 214,208,185,250,200,203,32,32,32,32
中国人
果真在ZHS16GBK 字符集下 每个汉字用2个字节,再看AL32UTF8
SQL> SELECT DUMP(COUNTRY),country FROM NATION_T;
DUMP(COUNTRY)
--------------------------------------------------------------------------------
COUNTRY
--------------------
Typ=96 Len=10: 228,184,173,229,155,189,32,32,32,32
中国
Typ=96 Len=10: 65,83,68,70,87,87,69,69,87,69
ASDFWWEEWE
有一点强调一下:本来是看字符串长度的,最后发现问题是存储的问题。所以说有时候某字段超过限制 很多人用length 来比较有没有超过限制,
我也这个搞过,呵呵,看来以后得注意了。不如定义varchar2(20),放10个汉字就满了,放不下别的字符了已经,但是查长度还是10。