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)
--声明标量变量 declare @a varchar(max)
- --给变量赋值'AAA'
- set @a = 'AAA'
--给变量赋值'AAA' set @a = 'AAA'
- --分别查询长度
- select LEN(@a) AS a_len,DATALENGTH (@a) AS a_datalength
--分别查询长度 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() 任何表达式的字节数,包括空格。
当采用UniCode编码时,感兴趣同学的可以自己试一下什么结果。
相关文章
- 实现Oracle,Mysql,SqlServer数据库的codefirst的操作
- C#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle)
- sqlserver存储过程
- com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。
- SQLSERVER 函数大全
- sqlserver 日期时间函数
- 利用IIS、Zblog、SQLServer搭建ASP博客
- SQLServer · 最佳实践 · SQL Server优化案例分享
- SQLServer · 特性分析 · SQL Server 2012的分析函数未必都理解透了(2)
- SQLServer · 最佳实践 · 开发基于.NET CORE的LINUX版本的数据库应用
- C# 批量插入数据到SqlServer中的四种方式
- 使用sqlserver日期函数获取当前日期(指定格式)
- 数据库MySQL、Oracle、SQLServer、db2分页查询语句
- 成功解决启动SQLServer失败,根据错误信息判断错误故障
- SQlserver表连接
- 解决办法:[sqlserver] Cannot connect to XXXXSQLEXPRESS
- SQLServer数据类型与C#类型对照表