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编码时,感兴趣同学的可以自己试一下什么结果。

原文链接

原文地址:https://www.cnblogs.com/OpenCoder/p/8400542.html

时间: 2024-08-30 01:36:37

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

Golang中的内置函数

??Go中存在着不少内置函数,此类函数并不需要引入相关Package就可以直接使用该类函数.在Go的源码builtin包的builtin.go中定义Go所有的内置函数:但该文件仅仅是定义描述出了所有内置函数,并不包含函数的任何实现代码,该文件除了定义了内置函数还定义了部分内置类型: 内置函数使用 len("123") println("log") fmt.Println("fmt") // 非内置函数使用,调用fmt包中的函数 常用内置函数 cl

JavaScript 中Array数组的几个内置函数

本文章内容均参考<JavaScript高级程序设计第三版> 今天在看JavaScript书籍的时候,看到之前没有了解过的JavaScript中Array的几个内置函数对象,为了之后再开发工作中能方便查询,故编写此随笔.直接贴代码, function arrayEffect(){ var numbers = [1,2,3,4,5,6,7,8,9,10]; //------------------------------------ 支持浏览器版本 IE9+,Firfox 2+ ,Safair 3

python内置函数总结

取绝对值的内置函数: abs print(bas(-9)) #-9的绝对值会被打印出来 2. 处理可迭代对象的函数(一):all name = ("Tom","Jack","Lily") print(all(name))   #因name这个变量定义的可迭代对象是一个正确的列表 所以实print执行会返回True,只有可迭代对象全为真, 返回结果才为True. 3.处理可迭代对象函数(二):any name = ("Tom",

内置函数与匿名函数

内置函数 1.取绝对值的内置函数: abs print(bas(-9)) #-9的绝对值会被打印出来 2. 处理可迭代对象的函数(一):all name = ("Tom","Jack","Lily") print(all(name)) #因name这个变量定义的可迭代对象是一个正确的列表 所以实print执行会返回Truse,只有可迭代对象全为真, 返回结果才为True. 3.处理可迭代对象函数(二):any name = ("Tom&

[Unity Shader] 坐标变换与法线变换及Unity5新增加的内置函数

学习第六章Unity内置函数时,由于之前使用mul矩阵乘法时的顺序与书中不一致,导致使用内置函数时出现光照效果不一样,因此引出以下两个问题: 1 什么时候使用3x3矩阵,什么时候使用4x4矩阵? 2 法线变换矩阵与坐标变换矩阵不相同? 解答1: 4.9.1节书中讲述了何时使用3x3和4x4矩阵.因为4x4矩阵是比3x3矩阵多了平移变换,因此对空间坐标进行变换时,通常使用4x4矩阵.而对于切线和法线这两种空间矢量,不存在平移的情况,因此仅使用3x3矩阵即可(是否可以偷懒使用4x4矩阵?是可以的).

Python类型及内置函数

List类型常用函数: append(obj):在列表尾部添加一个对象 count(obj):计算对象在列表中出现的次数 extend(seq):把序列seq的内容添加到列表中 index(obj,i=0,j=len(list)):计算对象obj在列表中的索引位置 insert(index,obj):把对象插入列表index指定的位置 pop(index=-1):读取并删除index位置的对象,默认为最后一个对象 remove(obj):从列表中删除对象obj reverse():获得反向列表

面向对象进阶------&gt;内置函数 str repr new

__new__方法: 我们来讲个非常非常重要的内置函数和init一样重要__new__其实在实例话对象的开始  是先继承父类中的new方法再执行init的  就好比你生孩子 先要把孩子生出来才能对孩子穿衣服的  new就是生孩子 init是给孩子穿衣服 new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,可以这么理解,在Python 中存在于类里面的构造方法init()负责将类的实例化,而在init()调用之前,new()决定是否要使用该init()方法,因为new()

Spark SQL内置函数

Spark SQL内置函数官网API:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions%24 平常在使用mysql的时候,我们在写SQL的时候会使用到MySQL为我们提供的一些内置函数,如数值函数:求绝对值abs().平方根sqrt()等,还有其它的字符函数.日期函数.聚合函数等等.使我们利用这些内置函数能够快速实现我们的业务逻辑.在SparkSQL里其实也为我们提供了近

Python内置函数进制转换的用法

使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x)Convert an integer number to a binary string. The result is a valid Python expression. If x is not a Python int object, it has to define an __index__() method that returns a