SQLServer中DataLength()和Len()两内置函数的区别(转载)

Posted PowerCoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLServer中DataLength()和Len()两内置函数的区别(转载)相关的知识,希望对你有一定的参考价值。

最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE’为key去取Value的值是取不出来的,结果是空。后来查看数据库字段类型才发现了问题所在。大家都知道,char和varchar的区别就在于一个是固定长度,一个是可变长度。在寻找问题的过程中,用到了我们今天要说的这两个内置函数,DataLength()和Len()。
在解释DataLength()和Len()的区别之前,我们先来了解一下varchar(n)和nvarchar(n)的区别。

  • varchar(n):长度为n个字节的可边长度且非Unicode编码的字符数据,n必须是介于1和8000之间的数值。存储大小为输入数据的字节的实际长度,而不是n个字节。
  • nvarchar(n):包含n个字符的可变长度Unicode字符数据,n必须是介于1和4000之间,字节的存储大小是所输入的字符个数的两倍。

也就是说,varchar(2)最多可以存储2个字母,或者是1个汉字;而nvarchar(2)最多可以存储2个字母,或者两个汉字,就是说nvarchar(2)包含两个字符=4个字节。
了解了以上内容,我们来通过例子看下DataLength()和Len()的区别:

--声明标量变量  
declare @a varchar(max)  
--给变量赋值\'AAA\'
set @a = \'AAA\'
--分别查询长度
select LEN(@a) AS a_len,DATALENGTH (@a) AS a_datalength

1、@a=\'AAA\',结果如下: 

2、@a=\'AAA  \',这里尾部加了两个空格,结果如下:

3、@a=\'  AAA\',这里前面加了两个空格,结果如下:

4、@a=\'A A A\',这里A之间各加一个空格,结果如下:

得出以下结论:

当采用非Unicode编码时,即varchar类型的字符串时,DataLength()和Len()的区别:

  • Len() 字符串表达式的字符数,不计尾部空格,但计头部空格和中间的空格;
  • DataLength() 任何表达式的字节数,包括空格,所以当数据类型是nvarchar时,其实DataLength() 除以2就相当于Len()计算字符串末尾空格后的字符数,所以计算sql server中nvarchar字符串长度的最佳方式就是DataLength() /2

当采用UniCode编码时,感兴趣的同学可以自己试一下什么结果:

DECLARE @a NVARCHAR(10)=N\'AAA   \'--尾部有三个空格

SELECT LEN(@a),DATALENGTH(@a)

结果如下:

 

 

原文链接

 

以上是关于SQLServer中DataLength()和Len()两内置函数的区别(转载)的主要内容,如果未能解决你的问题,请参考以下文章

sql server 字符匹配 有关汉字

sqlserver中两个text类型数值如何比较是不是相等

SQLServer 中怎么计算字段类型为text 的长度?急!

错误:LINQ to Entities 无法识别方法 DataLength

SQL中datelength和len函数的区别

SqlSever基础 datalength函数 计算前后都有空格的字符串的长度