下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

数据库使用变量类型不同输出结果不一致

作者:潇湘隐者     来源: DBA闲思杂想录点击数:944发布时间: 2021-07-12 17:14:25

标签: 数据库原理MySQL数据库数据库管理系统

解惑SQL Server中LIKE使用变量类型不同输出结果不一致。数据库中的数据是为众多用户所 共享其信息而建立的,已经摆脱了具体 程序的限制和制约。不同的用户可以按各自的用法使用数据库中的数据;多个用户可以同时共享数据库中的数据资源,即不同的用户可以同时存取数据库中的同一个数据。数据共享性不仅满足了各用户对信息内容的要求,同时也满足了各用户之间信息通信的要求。

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

数据库使用变量类型不同输出结果不一致_数据库_MySQL_数据结构_课课家

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

数据库是一个 单位或是一个应用领域的通用数据处理系统,它存储的是属于企业和事业部门、 团体和个人的有关数据的 集合。数据库中的数据是从全局观点出发建立的,按一定的 数据模型进行组织、描述和存储。其结构基于数据间的自然联系,从而可提供一切必要的存取 路径,且数据不再针对某一应用,而是面向全组织,具有整体的结构化特征。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程