T-SQL令人惊讶的是char和nchar的DATALENGTH值

时间:2014-03-16 19:02:08

标签: tsql unicode char datalength

SELECT DATALENGTH('źźźź')                       -- 4
SELECT DATALENGTH(CONVERT(char, 'źźźź'))        -- 30
SELECT DATALENGTH(CONVERT(nchar, 'źźźź'))       -- 60
SELECT DATALENGTH(CONVERT(varchar, 'źźźź'))     -- 4
SELECT DATALENGTH(CONVERT(nvarchar, 'źźźź'))    -- 8

我知道char是非Unicode类型,但是nchar实际上是unicode类型

1 个答案:

答案 0 :(得分:1)

是的 - 你的问题是什么?

如果您未在CASTCONVERT中定义长度,则 30个字符是系统默认值。

所以这个

SELECT DATALENGTH(CONVERT(char, 'źźźź'))  

相当于

SELECT DATALENGTH(CONVERT(char(30), 'źźźź'))  

由于CHAR(和NCHAR)数据类型始终填充到其定义的长度,因此您获得30个字符,因此30(char)和60(nchar)字节长度。

完全清晰且记录完备 - 请参阅MSDN documentation on CAST and CONVERT

  

长度

     

是一个可选的整数,指定目标数据类型的长度。 默认值为30

当您使用可变长度字符串而不是varcharnvarchar时,您只能获得与字符串中确实存储的字符数一样多的字符 - 因此您将获得4个字符,从而获得4个字符和8个字符长度的字节。