程序员

解惑SQL Server中LIKE使用变量类型不同输出结果不一致

作者:admin 2021-04-13 我要评论

本文转载自微信公众号「DBA闲思杂想录」,作者潇湘隐者。转载本文请联系DBA闲思杂想录公众号。 一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

本文转载自微信公众号「DBA闲思杂想录」,作者潇湘隐者。转载本文请联系DBA闲思杂想录公众号

一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人不解的现象背后实质跟数据类型的实现有关。

下面我们构造这样一个类似的简单案例。如下所示:

  1. CREATE TABLE TEST 
  2.   ID        INT IDENTITY(1,1), 
  3.   NAME      VARCHAR(32) 
  4.   
  5. INSERT INTO dbo.test 
  6. SELECT 'abc32'
  7.   
  8. INSERT INTO dbo.test 
  9. SELECT 'abd32'
  10.   
  11. INSERT INTO dbo.test 
  12. SELECT 'abe32' ; 
  13.   
  14.   
  15.   
  16.   
  17. DECLARE @name  VARCHAR(32); 
  18. SET @name='ab%'
  19. SELECT * FROM TEST WHERE NAME LIKE @name
  20.   
  21.   
  22. DECLARE @name1 CHAR(32); 
  23. SET @name1='ab%'
  24. 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 'ab%' 与 LIKE 'abc% '的逻辑完全不同。

其实你想从侧面印证一下也很简单,如下脚本对比所示,仔细理解一下,也许你就想明白了!

  1. DECLARE @name  CHAR(32); 
  2.  
  3. SET @name='ab%'
  4.  
  5. SELECT * FROM TEST WHERE NAME LIKE @name
  6.  
  7.   
  8. DECLARE @name1 CHAR(3); 
  9.  
  10. SET @name1='ab%'
  11.  
  12. SELECT * FROM dbo.TEST WHERE NAME LIKE @name1; 


本文转载自网络,原文链接:https://mp.weixin.qq.com/s/9rf-ECKAQIYVgzIySYPfFQ

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 四两拨千斤——你不知道的VScode编码Ty

    四两拨千斤——你不知道的VScode编码Ty

  • 我是如何在 Vue 项目中做代码分割的

    我是如何在 Vue 项目中做代码分割的

  • position:sticky 粘性定位的几种巧妙应

    position:sticky 粘性定位的几种巧妙应

  • 从零到一搭建React组件库

    从零到一搭建React组件库

腾讯云代理商
海外云服务器