自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解惑SQL Server中LIKE使用變量類型不同輸出結(jié)果不一致

運(yùn)維 數(shù)據(jù)庫運(yùn)維
一同事在寫腳本時(shí),遇到一個(gè)關(guān)于LIKE里面使用不同的變量類型導(dǎo)致查詢結(jié)果不一致的問題,因?yàn)檫@個(gè)問題被不同的人問過好幾次,索性總結(jié)一下,免得每次都要解釋一遍,直接丟一篇博客豈不是更方便!其實(shí)看似有點(diǎn)讓人不解的現(xiàn)象背后實(shí)質(zhì)跟數(shù)據(jù)類型的實(shí)現(xiàn)有關(guān)。

[[380144]]

本文轉(zhuǎn)載自微信公眾號(hào)「DBA閑思雜想錄」,作者瀟湘隱者。轉(zhuǎn)載本文請(qǐng)聯(lián)系DBA閑思雜想錄公眾號(hào)。

一同事在寫腳本時(shí),遇到一個(gè)關(guān)于LIKE里面使用不同的變量類型導(dǎo)致查詢結(jié)果不一致的問題,因?yàn)檫@個(gè)問題被不同的人問過好幾次,索性總結(jié)一下,免得每次都要解釋一遍,直接丟一篇博客豈不是更方便!其實(shí)看似有點(diǎn)讓人不解的現(xiàn)象背后實(shí)質(zhì)跟數(shù)據(jù)類型的實(shí)現(xiàn)有關(guān)。

下面我們構(gòu)造這樣一個(gè)類似的簡(jiǎn)單案例。如下所示:

  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; 

如上截圖所示,當(dāng)變量使用VARCHAR類型與CHAR類型時(shí),兩者的輸出結(jié)果完全不一樣。如果對(duì)SQL SERVER數(shù)據(jù)類型了解不透徹的話,估計(jì)真的對(duì)這個(gè)問題感到相當(dāng)?shù)睦Щ?。但是?duì)SQL Server數(shù)據(jù)類型了解比較深入的人來說,這真的是一個(gè)簡(jiǎn)單到不能再簡(jiǎn)單的問題。

如下所示,我們?cè)赟QL語句中加入兩句SQL,用DATALENGTH函數(shù)返回任何表達(dá)式的字節(jié)數(shù),你會(huì)發(fā)現(xiàn)VARCHAR類型的變量返回的字節(jié)數(shù)為3,但是CHAR類型的變量的字節(jié)數(shù)為32,其實(shí)原因就在于CHAR類型是定長(zhǎng)的,也就是當(dāng)你輸入的字符小于你指定的數(shù)目時(shí),例如char(32),你輸入的字符長(zhǎng)度小于32時(shí),它會(huì)在后面補(bǔ)空值。當(dāng)你輸入的字符長(zhǎng)度大于指定的值時(shí),它會(huì)截取超出的字符. 所以下面兩種LIKE的邏輯意義不一樣。LIKE 'ab%' 與 LIKE 'abc% '的邏輯完全不同。

其實(shí)你想從側(cè)面印證一下也很簡(jiǎn)單,如下腳本對(duì)比所示,仔細(xì)理解一下,也許你就想明白了!

  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; 

 

責(zé)任編輯:武曉燕 來源: DBA閑思雜想錄
相關(guān)推薦

2017-08-25 17:59:41

浮點(diǎn)運(yùn)算C語言

2025-04-03 09:51:37

2024-05-11 07:37:43

數(shù)據(jù)Redis策略

2012-01-11 16:22:35

HTML 5

2017-06-20 09:42:52

網(wǎng)絡(luò)安全法數(shù)據(jù)隱私法網(wǎng)絡(luò)安全

2021-01-19 05:39:17

SQLServer變量

2018-07-15 08:18:44

緩存數(shù)據(jù)庫數(shù)據(jù)

2018-07-08 07:38:28

數(shù)據(jù)庫緩存數(shù)據(jù)

2020-07-20 14:06:38

數(shù)據(jù)庫主從同步服務(wù)

2022-03-18 10:53:49

數(shù)據(jù)系統(tǒng)架構(gòu)

2010-06-02 10:53:28

MySQL版本

2021-05-27 18:06:30

MySQL編碼數(shù)據(jù)

2024-04-07 09:00:00

MySQL

2013-03-29 11:16:17

2021-01-19 10:39:03

Redis緩存數(shù)據(jù)

2013-12-13 14:46:55

OSPFMTU鄰接關(guān)系

2021-04-18 15:01:56

緩存系統(tǒng)數(shù)據(jù)

2022-03-16 15:54:52

MySQL數(shù)據(jù)format

2024-11-18 08:00:00

數(shù)據(jù)倉庫通用語義層商業(yè)智能

2023-09-15 10:29:32

Java接口
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)