亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【SQL】小心字符串拼接導致長度爆表

系統 1743 0
原文: 【SQL】小心字符串拼接導致長度爆表

請看代碼:

      
        
          DECLARE
        
        
          @max
        
        
          VARCHAR
        
        (
        
          max
        
        
          ) 
        
        
          SET
        
        
          @max
        
        
          =
        
        
          '
        
        
          aaa...
        
        
          '
        
        
          --
        
        
          這里有8000個a
        
        
          +
        
        
          '
        
        
          bb
        
        
          '
        
        
          --
        
        
          連接一個varchar常量或變量
        
        
          SELECT
        
        
          LEN
        
        (
        
          @max
        
        )
      
    

別想當然以為它會返回8002,而是8000,select @max也只會得到8000個a,后面兩個b沒了。我們知道,varchar(max)類型不受字符數限制,但為什么會這樣?

這其實與@max的數據類型無關,而是與字符串拼接后得到的數據類型有關,或者說,與字符串常量的數據類型推斷有關。在SQL 2005和SQL 2008(R2)中,敲一個'a',系統會把它作為varchar(1),'aa'則是varchar(2),N'a'則是nvarchar(1),而'a...'(超過8000個a)呢,05中會當它是text,08則當它是varchar(max),常量或變量的數據類型可以通過系統函數SQL_VARIANT_PROPERTY獲取,使用示例:

      
        
          SELECT
        
         SQL_VARIANT_PROPERTY(
        
          '
        
        
          a
        
        
          '
        
        ,
        
          '
        
        
          BaseType
        
        
          '
        
        )
      
    

有關該函數的更多信息請參看SSMS幫助或 http://technet.microsoft.com/zh-cn/library/ms178550(v=sql.105).aspx

那么問題來了,既然超過8000個字符的常量系統會自動識別為大數據類型,不會出現截斷,為什么拼接一下就歇菜了,這是因為varchar(n)+varchar(n)還是=varchar(n),拼接時系統會自動拓展數據長度,但不會更改數據類型(varchar(n)與varchar(max)應視為不同數據類型),又因為varchar(n)中的n最大取值為8000,所以varchar(x)+varchar(y)最大只會得到varchar(8000),當x+y>8000時,便會出現截斷。

回到文章開頭的例子,就很明了了,'aaa...'和'bb'都是varchar(n),拼接后得到varchar(8000),也就是截斷了的8000個'aaa...',所以即便把它賦值給varchar(max)也無濟于事。如果'aaa...'再多個a,情況又不同了,這時就是text或varchar(max)+varchar(n),對于05,會報text與varchar不能拼接,對于08,會正確得到無截斷的'aaa...bb',因為varchar(max)+varchar(n)=varchar(max)。

OK就到這里,希望猿友在拼接SQL字串時留意這個問題。

【SQL】小心字符串拼接導致長度爆表


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产成人久久综合一区77 | 久久久久久久久66精品片 | 国产精品一区二 | 久久九九国产 | 欧美日韩制服 | 亚洲高清一区二区三区 | 亚洲精品乱码久久久久久蜜桃 | 久久成年人| 婷婷视频在线 | 亚洲美女视频网址 | 日本在线一卡二卡毛片 | 日韩激情中文字幕一区二区 | 欧美一级看片a免费视频 | 一区一区三区产品乱码 | 另类日本人xxxxbbbb | 天色噜噜噜噜 | 国产丶欧美丶日韩丶不卡影视 | 亚洲欧美日韩综合 | 亚洲啪啪看看 | 国产精品成人久久久 | 亚洲视频中文字幕在线观看 | 精品福利视频第一 | 欧美成人在线视频 | 欧美日韩视频一区三区二区 | 久久久久久色 | 年级的后妈妈2中文翻译 | 九月婷婷天天澡天天添天天爽 | 69欧美另类xxxxx高清 | 国产亚洲欧美日韩国产片 | 欧美一区二区三区免费视频 | 国产成人亚洲综合欧美一部 | 日本aa在线| 中文国产成人久久精品小说 | 黄色影院在线观看视频 | 亚洲色图插插插 | 成年人视频在线免费 | 日韩欧美视频一区二区三区 | 精品一区亚洲 | 国产在线观看不卡 | 一级美国乱色毛片 | 好好的日com欧美 |