sqlserver 表中的數據存在空白字符串怎麼處理

直接在庫中更改數據庫的語句爲

UPDATE 表名SET 字段名1=RTRIM(字段名1) where 字段名1 like '% ';

函數TRIM()

LTRIM()即left-trim,把左邊空格修剪掉。 

RTRIM()即right-trim,把右邊的空格修剪掉。

declare @test_var1 varchar(60),@test_var2 varchar(60)
set @test_var1='   Hello World   '
set @test_var2=ltrim(@test_var1)
print '---'+@test_var2+'---'

輸出爲:---Hello World ---

declare @test_var1 varchar(60),@test_var2 varchar(60)
set @test_var1='   Hello World   '
set @test_var2=rtrim(@test_var1)
print '---'+@test_var2+'---'

輸出爲:--- Hello World---

問題解決方案
sqlserver是微軟出的數據庫軟件,不太可能犯這種錯誤,所以很可能是sqlserver的設置導致出現這種問題。於是在網上搜索解決方案,搜索詞類似於“sqlserver varchar auto trim”這種,找到了參考文獻1-4。
參考文獻中介紹的比較詳細,這裏就不細說原理了,主要是與sqlserver中的ANSI_PADDING命令有關係。參考文獻4中介紹說這個命令只在創建表時生效,後面就不再改動,並且該命令隻影響varchar,不會用nvarchar類型造成影響。
於是有了下面幾種解決方法:
1)將數據庫表列的類型由varchar改爲nvarchar
2)重新創建表,創建表的同時設置ANSI_PADDING的值,但是如果表中有數據,這種方法就不是很好
3)寫程序處理,例如寫入數據庫之前把字符串變爲base64編碼,從數據庫中讀出來時再解碼。這種方法也存在一個歷史數據的問題,因爲歷史數據沒有編碼,可以設置一個標誌位或者標誌字符串標識一下保存在數據庫中的數據是否經過編碼,這種做法稍微麻煩一些,但不會對數據庫造成更改。
我最終採用的是第三種方法,就是在保存到數據庫之前檢查字符串末尾是否爲空格,如果是空格,就加一個標誌字符串( 要保證用戶的輸入中肯定不會出現標誌字符串),從數據庫中讀出來後檢查字符串結尾是否有標誌字符串,如果有則將標誌字符串去除。這種做法雖然麻煩,但是不用修改數據庫,對歷史數據也沒有影響,可以暫時解決問題。
但是最好的解決方法是以後建數據庫表時將varchar類型的列變爲nvarchar,這樣才能一勞永逸的解決問題。

參考文獻
[1]http://techygypo.blogspot.jp/2011/06/auto-trimming-whitespace-removal-in-sql.html
[2]http://www.sqlines.com/sql-server/ansi_padding
[3]https://msdn.microsoft.com/en-us/library/ms187403.aspx
[4]http://stackoverflow.com/questions/1571180/auto-trim-database-entries


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章