原文:
t-sql字串相加之後被截斷的那點事
本文出處:
字串自身相加, 雖然賦值給了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
json字串太長 被截斷
最近我們有個專案,之前一直沒有安裝監控,因為是老得專案,之前沒有安裝nginx,那就沒辦法收集nginx的日誌,然後把日誌做切分實時展示,所以上週我們就裝了nginx,然後就出現問題了 我們這個專案有個介面因為資料比較多,返回的json串就特別長,你用curl調這個介面,發現返回的json串被截斷。...
sql中字串被截斷的問題除錯
今天下午在程式呼叫乙個儲存過程的時候出現了字串截斷問題,因為自己是實習生,而且對sql比較生疏,所以花了乙個多小時才排查出來。首先是檢視報錯資訊,執行儲存過程 出錯 物件名 b 無效。16 03 26,124 error stderr com.ztkj.batj.exception.daoexcep...
MySQL 插入的長字串被截斷問題
mysql 出現了乙個問題,插入乙個長字串 二十幾kb 結果導致被截斷。首先排除了資料型別的問題,用的 mediumtext 型別。接著排除了php 的問題,因為取出 sql 直接在 mysql 中執行還是被截斷。發現一點很奇怪,截斷的那個長字串差不多很接近 8kb,如果加上其他欄位的內容,可能正好...