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


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