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()两内置函数的区别(转载)的更多相关文章
- SQLServer中DataLength()和Len()两内置函数的区别
		最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE ... 
- Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
		Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ... 
- mysql 内置函数和sql server 内置函数的区别
		以下函数均没有对参数做说明,使用的使用需要了解其参数内容 数据库 sql server mysql oracle 举例 获得当前系统时间 getdate() now() sysdate 注意不是函数 ... 
- python中的运算符及表达式及常用内置函数
		知识内容: 1.运算符与表达式 2.for\while初步了解 3.常用内置函数 一.运算符与表达式 python与其他语言一样支持大多数算数运算符.关系运算符.逻辑运算符以及位运算符,并且有和大多数 ... 
- JavaScript 中Array数组的几个内置函数
		本文章内容均参考<JavaScript高级程序设计第三版> 今天在看JavaScript书籍的时候,看到之前没有了解过的JavaScript中Array的几个内置函数对象,为了之后再开发工 ... 
- Python内置函数分类汇总
		Python解释器内置了很多函数,这些内置函数使用方便,无需导入,直接调用.可以在交互模式下输入dir(__builtins__),输出的列表中包含了所有的内置函数: 1.可迭代对象.序列操作相关 ... 
- python学习笔记(七)——内置函数
		builtins.py模块,是python的内建模块,在运行时会自动导入该模块.在该模块中定义了很多我们常用的内置函数,比如print,input 等. 在 builtins.py 模块中给出如下注释 ... 
- Spark SQL内置函数
		Spark SQL内置函数官网API:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.fun ... 
- [Unity Shader] 坐标变换与法线变换及Unity5新增加的内置函数
		学习第六章Unity内置函数时,由于之前使用mul矩阵乘法时的顺序与书中不一致,导致使用内置函数时出现光照效果不一样,因此引出以下两个问题: 1 什么时候使用3x3矩阵,什么时候使用4x4矩阵? 2 ... 
随机推荐
- j2ee高级开发技术课程第八周
			介绍一. hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢? 因 ... 
- 选择排序:直接选择排序&堆排序
			上一篇中, 介绍了交换排序中的冒泡排序和快速排序, 那么这一篇就来介绍一下 选择排序和堆排序, 以及他们与快速排序的比较. 一.直接选择排序 1. 思想 在描述直接选择排序思想之前, 先来一个假设吧. ... 
- 面试题----gcc的编译流程
			gcc编译流程 一. 编译与处理指令: gcc -E hello.c -o a.c 如果不使用-o指定输出的文件,会默认输出到终端.所以建议使用同时使用-o选项. 还要注意:编译时会保留#pra ... 
- -bash: warning: setlocale: LC_CTYPE: cannot change locale (zh_US.UTF-8): No such file or directory -bash: warning: setlocale: LC_COLLATE:
			前几天登录服务器发现出现了这些个警告,一直没时间去处理他,今天难得有空,处理一下并记录下来,希望可以帮助到有需要的朋友. 警告信息如下: Last :: from 10.0.0.1 -bash: wa ... 
- 【虚拟机ubuntu设置ssh】ssh连不上问题解决方法
			首先,确保server端的ssh服务是开的(service shhd start) 然后在client端输入: ssh usrname@serverip (远程登录) scp filename usr ... 
- Netty 源码剖析之 unSafe.read 方法
			目录: NioSocketChannel$NioSocketChannelUnsafe 的 read 方法 首先看 ByteBufAllocator 再看 RecvByteBufAllocator.H ... 
- Docker学习链接
			Docker安装篇 1>.Windows Docker 安装 
- C#多线程和线程池[转]
			1.概念 1.0 线程的和进程的关系以及优缺点 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,C ... 
- oracle创建表的方法和一些常用命令
			1.主键和外键主键:关系型数据库中的一条记录中有若干个属性,若其中的某一个属性组(注意是组,可以是一个,也可以是多个)能唯一标识一条记录,那么该属性组就是主键外键:关系型数据库表中的一列或者某几列的组 ... 
- JS去掉字符串前后空格或去掉所有空格的用法
			1. 去掉字符串前后所有空格: 代码如下: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } 说明 ... 
