SQL Server中DATALENGTH返回值不一致问题排查咨询
问题原因分析
差异的核心在于存储列的数据类型与直接输入的字符串常量类型不匹配,具体有两种常见情况:
Unicode与非Unicode字符类型的字节差异
DATALENGTH()函数返回的是数据占用的字节数,而非字符数。SQL Server中,nvarchar/nchar这类Unicode类型的字符,每个会占用2字节;而单引号包裹的字符串默认是varchar(非Unicode),每个字符仅占1字节。
你复制的字符串字符数是36,若存储列是nvarchar类型,字节数就是36×2=72,恰好和查询结果一致。固定长度字符类型的自动填充
如果列定义为nchar(N)(固定长度Unicode类型),SQL Server会自动用空格填充到定义的长度N。假设你的列是nchar(36),不管实际内容多少,字节数都是36×2=72,这也会造成和直接字符串的DATALENGTH结果差一倍。
验证方法
- 查看列类型:执行
sp_help '你的表名',查看对应列的数据类型和定义长度。 - 对比字符数:用
LEN()函数分别查询列和字符串常量的实际字符数(LEN()会忽略末尾空格)。如果两者字符数一致,说明是Unicode类型导致的字节翻倍;如果列的LEN()结果小于DATALENGTH()/2,则是固定长度类型的空格填充所致。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

