本文转载自微信公众号《DBA闲思杂想录》,作者潇湘隐士。转载本文请联系DBA杂念公众号。同事在写脚本的时候,遇到了LIKE中使用不同变量类型导致查询结果不一致的问题。因为这个问题已经被不同的人问过好几次了,我就简单总结一下,免得每次都解释。直接丢个博客岂不是更方便!其实,看似不解的现象其实与数据类型的实现有关。下面我们构建这样一个简单的案例。如下:CREATETABLETEST(IDINTIDENTITY(1,1),NAMEVARCHAR(32))INSERTINTOdbo.testSELECT'abc32';INSERTINTOdbo.testSELECT'abd32';INSERTINTOdbo.testSELECT'abe32';DECLARE@nameVARCHAR(32);SET@name='ab%';SELECT*FROMTESTWHERENAMELIKE@name;DECLARE@name1CHAR(32);SET@name1='ab%';SELECT*FROMdbo.TESTWHERENAMELIKE@name1;如上截图所示,当变量使用VARCHAR类型和CHARtype,两者的输出完全不同。如果你对SQLSERVER的数据类型没有深入了解,估计你真的对这个问题一头雾水。但是对于那些对SQLServer数据类型有更深入了解的人来说,这真的是一个简单到不能再简单的问题。如下图,我们在SQL语句中加入两句SQL,使用DATALENGTH函数返回任意表达式的字节数,你会发现VARCHAR类型变量返回的字节数是3,但是数CHAR类型变量返回的字节数是32,其实是因为CHAR类型是定长的,即当你输入的字符少于你指定的个数时,比如char(32),当你输入的字符长度小于32时,会补上后面的空白值。当您输入的字符长度大于指定值时,它会截取超出的字符。所以下面两种LIKE的逻辑含义是不一样的。LIKE'ab%'与LIKE'abc%'的逻辑完全不同。其实,如果要从侧面确认一下,就很简单了。如下图的脚本对比,如果你仔细理解,说不定你就明白了!DECLARE@nameCHAR(32);SET@name='ab%';SELECT*FROMTESTWHERENAMELIKE@name;DECLARE@name1CHAR(3);SET@name1='ab%';SELECT*FROMdbo.TESTWHERENAMELIKE@name1;
