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

2021-09-06 19:38:37 字數 1223 閱讀 7635

原文:

【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幫助或

那麼問題來了,既然超過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 拼接字串

寫sql的時候有時候用到需要拼接多個字段或者在查詢出結果的字段裡加入一部分固定的字串。方法一 在查詢到的結果後,用 去拼接。這種方法就不在贅述。方法二 使用資料庫提供的方法concat a,b oracle 中concat a,b 只能有兩個引數,如果concat中連線的值不是字串,那麼oracle...

sql字串拼接

oracle 使用 或者concat sql select aaa bbb from dual aaa bbb aaabbb sql select concat aaa ccc from dual concat aaa aaaccc mysql中,使用 如果字串全是數字則轉化為數字,否則轉換為0,也...

sql字串拼接

在sql語句中經常需要進行字串拼接,以sqlserver,oracle,mysql三種資料庫為例,因為這三種資料庫具有代表性。sqlserver select 123 456 oracle select 123 456 from dual 或select concat 123 456 from du...