日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

T-SQL字符串相加之后被截断的那点事

發布時間:2025/3/15 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 T-SQL字符串相加之后被截断的那点事 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

?

本文出處:http://www.cnblogs.com/wy123/p/6217772.html?

?

字符串自身相加, 雖然賦值給了varchar(max)類型的變量,在某些特殊情況下仍然會被“截斷”,這到底是varchar(max)長度的問題還是操作的問題?

?

1,兩個不超過8000長度的字符串自身相加,其結果長度超過8000之后會被截斷:

  不多說,直接上例子:定義一個字符串,賦值給?varchar(max)類型的變了,字符創長度為4040沒有,任何問題。

?

  把4040長度的字符串復制一份出來,也就是將兩個4040長度的字符串“相加”

?

  發現最后的結果是8000,為什么?肯定是被截斷了,因為select @strSQL出來的字符串少了一部分。

  varchar(max)定義的沒問題,相加也沒問題,那么為什么就被截斷?

  

  補充測試:此種情況下,用concat相加效果也一樣(會被截斷)

  

?

?

2,兩個字符串賦值給varchar(max)類型變量,用變量1+變量2的方式相加,其結果長度超過8000之后不會被截斷:

  上面問題先不回答,換一種操作方式看看結果

  將連個字符串先分別賦值給兩個varchar(max)的變量,將兩個變量相加,賦值給一個varchar(max)的變量,看看最后變量相加的結果

  

?

?  我想大概有答案了:

  1,兩個不超過8000長度的“字符串自身”相加,相加之后默認總長度是不超過8000的,超過8000的部分會被截斷

  2,將字符串賦值給varchar(max)變量之后,用“變量相加”的方式相加,賦值給一個varchar(max),其結果是不會被截斷的

?

3,兩個相加的字符串中有一個長度超過了8000,相加之后不會被截斷:

  另外還有一種情況,假如第一個字符串長度超過了8000,加一個任一長度的字符串(不管超不超過8000),最后的結果呢?

  再次做一下論證,試一試就知道了。

  此時第1個字符串長度超過了8000,第2個無所謂超不超過8000,那么相加之后,計算其LEN,最終的結果是沒有被截斷的。

?  補充測試:不截圖了,此種情況下,用concat相加也沒有問題(不會被截斷)

?

4,兩個相加的字符串中有一個長度超過了8000,分別賦值給變量,相加之后不會被截斷:

  

?

?

最終的結論有三個

  1,兩個不超過8000長度的“字符串自身”相加,相加之后默認總長度是不超過8000的,如果相加之后的長度超過8000,超過8000的部分會被截斷

?  ?2,相加的兩個字符串中有一個長度超過了8000,相加兩個字符串本身之后的結果是不會被截斷的。

  3,不管字符串長度如何,將字符串賦值給varchar(max)變量之后,用“變量相加”的方式相加,賦值給第三個varchar(max)變量,其結果是不會被截斷的

?

所以:當無法預計相加的兩個字符串本身的長度是多少,以及相加之后的長度是多少的時候,

   請不要直接對兩個字符串本身進行相加(+)操作,為了確保萬無一失,請將字符串賦值給varchar(max)變量之后,用變量相加,因為用變量相加的方式總是會沒有問題的。

?

補充:以上測試是以非Unicode字符為例的

   當字符串為Unicode字符型的時候(Unicode字符為兩個字節,非Unicode字符為1個字節),8000這個數值也要除以2,也即4000

轉載于:https://www.cnblogs.com/wy123/p/6217772.html

總結

以上是生活随笔為你收集整理的T-SQL字符串相加之后被截断的那点事的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。