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

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

[[380144]]

本文转载自微信公众号「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; 

 

责任编辑:武晓燕 来源: DBA闲思杂想录
相关推荐

2017-08-25 17:59:41

浮点运算C语言

2024-05-11 07:37:43

数据Redis策略

2012-01-11 16:22:35

HTML 5

2017-06-20 09:42:52

网络安全法数据隐私法网络安全

2021-01-19 05:39:17

SQLServer变量

2018-07-15 08:18:44

缓存数据库数据

2020-07-20 14:06:38

数据库主从同步服务

2022-03-18 10:53:49

数据系统架构

2018-07-08 07:38:28

数据库缓存数据

2010-06-02 10:53:28

MySQL版本

2024-04-07 09:00:00

MySQL

2021-05-27 18:06:30

MySQL编码数据

2013-12-13 14:46:55

OSPFMTU邻接关系

2013-03-29 11:16:17

2021-01-19 10:39:03

Redis缓存数据

2021-04-18 15:01:56

缓存系统数据

2022-03-16 15:54:52

MySQL数据format

2024-11-18 08:00:00

数据仓库通用语义层商业智能

2023-09-15 10:29:32

Java接口

2021-12-30 09:32:04

缓存数据库数据
点赞
收藏

51CTO技术栈公众号