以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 HTML/XHTML/Ajax/Web 2.0/Web 3.0 』  (http://bbs.xml.org.cn/list.asp?boardid=22)
----  在SQL SERVER 2000中字符形数据类型的详细解释  (http://bbs.xml.org.cn/dispbbs.asp?boardid=22&rootid=&id=47185)


--  作者:dogog
--  发布时间:5/19/2007 4:31:00 PM

--  在SQL SERVER 2000中字符形数据类型的详细解释
nchar,nvarchar与char,varchar的区别- -
                                      

char,varchar用于描述定,变长的字符型数据。

nchar,nvarchar用来存储Unicode字符集的定,变长字符型数据。

如:

SQL> create table test_char (char_col char(10), varchar_col varchar2(10));

SQL> insert into test_char values ('定长', '变长');

SQL> SELECT DUMP(CHAR_COL, 16) D_CHAR FROM TEST_CHAR;


D_CHAR
----------------------------------------------------------------
Typ=96 Len=10: 61,62,63,20,20,20,20,20,20,20
Typ=96 Len=10: b6,a8,b3,a4,20,20,20,20,20,20


SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;


D_VARCHAR2
----------------------------------------------------------------
Typ=1 Len=3: 31,32,33
Typ=1 Len=4: b1,e4,b3,a4

SQL> create table test_nchar (nchar_col nchar(10), nvarchar_col nvarchar2(10));

SQL> insert into test_nchar values ('nchar定长', 'nvarchar变长');

如果按照刚才中文的计算方法,'nvarchar变长'的长度是8+2*2=12已经超过了数据类型定义的大小,可是为什么插入成功了?

SQL> select dump(nchar_col, 16) from test_nchar;


DUMP(NCHAR_COL,16)
--------------------------------------------------------------
Typ=96 Len=20: 0,6e,0,63,0,68,0,61,0,72,5b,9a,95,7f,0,20,0,20,0,20


SQL> select dump(nvarchar_col, 16) from test_nchar;


DUMP(NVARCHAR_COL,16)
--------------------------------------------------------------
Typ=1 Len=20: 0,6e,0,76,0,61,0,72,0,63,0,68,0,61,0,72,53,d8,95,7f

这下就明白了,虽然仍然是采用ascii码存储,但是nchar使用的AL16UTF16字符集,编码长度变为2个字节。这样中文使用两个字节,对于可以用一个字节就表示的英文字符,采用了高位补0的方式凑足2位,这样,对于采用AL16UTF16字符集的nchar类型,无论中文还是英文都用2位字符表示。因此'nvarchar变长'的长度是10,并没有超过数据类型的限制


--  作者:dogog
--  发布时间:5/19/2007 4:33:00 PM

--  
在SQL SERVER 2000中,CHAR和VCHAR可以放8000个字符
而NCHAR和NVARCHAR只能放4000个吧
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms