SQL SERVER中LIKE使用变量类型输出结果不同
2018-06-01 11:32
260 查看
前言:Sql Server中LIKE里面使用不同的变量类型导致查询结果不一致的问题,其实看似有点让人不解的现象背后实质跟数据类型的实现有关。
一、我们先来创建示例演示具体操作
CREATE TABLE TEST (ID INT IDENTITY(1,1), NAME VARCHAR(32) ) INSERT INTO dbo.test SELECT 'xiaofei' INSERT INTO dbo.test SELECT 'xiaofei' INSERT INTO dbo.test SELECT 'xiaofei' DECLARE @name VARCHAR(32); SET @name='xiao%'; SELECT * FROM TEST WHERE NAME LIKE @name; DECLARE @name1 CHAR(32); SET @name1='xiao%'; SELECT * FROM dbo.TEST WHERE NAME LIKE @name1;
如上截图所示,当变量使用VARCHAR类型与CHAR类型时,两种的输出结果完全不一样。如果对SQL SERVER数据类型了解不透彻的话,估计真的对这个问题感到相当困惑。但是对SQL Server数据类型了解比较深入的人来说,这真的是一个简单到不能再简单的问题。
二、谜题解悟-查看背后的属性>
如下所示,我们在SQL语句中加入两句SQL,用DATALENGTH返回任何表达式的字节数,你会发现VARCHAR类型的变量返回的字节数为3,但是CHAR类型的变量的字节数为32,其实原因就在于CHAR类型是定长的,也就是当你输入的字符小于你指定的数目时,例如char(32),你输入的字符小于32时,它会在后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符. 所以下面两种LIKE的逻辑意义不一样。LIKE 'xiao%' 与 LIKE 'xiao% '的逻辑完全不同。
其实你想从侧面印证一下也很简单,如下脚本对比所示,仔细理解一下,也许你就想明白了!
我们查看变量然后复制到窗口就可以看到,第一个是@name的变量只有赋值的字节大小,而第二个@name1的变量在后面很长我截图的时候把光标带上大家可以看清长度。
所以like xiao% 和 like xiao% | 有很大的差别啊。
相关文章推荐
- printf函数使用—针对不同数据类型的输出结果详解
- Oracle使用%type类型的变量输出结果
- 不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据(取出Result结果集中的字段(不同类型))
- SQL Server 动态SQL使用(处理输入和输出变量)
- 查询109号员工的员工号,员工名,工资,使用记录类型变量的字段接收查询结果
- 不同类型间使用相等操作符"=="的比较结果
- 根据用户的选择输出不同的结果--函数指针的使用
- java小练习(使用八种基本数据类型定义八个变量,然后在控制台输出各个变量的值)
- Oracle 和SQL Server 语句与数据类型使用上的不同之处 (转)
- 不使用第三个变量交换两个变量的值,不同编译器的不同结果
- JavaScript,由于不区分类型,都是var,所以导致整型的变量(如var test=1)使用length函数即test.length就会发现,输出undefined
- (本程序功能:字符串A中找出包含字符串B中所有字符的位置并输出) 在使用全局变量m的时候,输出错误的结果,而用下面局部变量M就没问题。
- C语言学习2:sizeof ,数据类型,scanf,算式操作,赋值与比较操作,逻辑操作,位的操作,条件运算符,特异赋值结果,强制转换,使用变量要注意的
- 如何使用QString把不同类型的数据如何转换成字符串形式输出
- 不同变量类型的不同输出格式
- 不同变量类型的不同输出格式
- mapreduce输出时按情况使用不同的文件名输出结果
- 使用指针类型参数和使用指针引用类型参数在函数内部用new给参数分配空间的不同结果
- mapreduce不同类型的数据分到同一个分区是否会影响输出结果
- 需要DLL函数输出的结果信息,尽量使用传入参数做为输出变量~!