删除SQL Server字段末尾的隐藏字符

时间:2014-08-14 18:09:55

标签: sql sql-server sql-server-2008

我有一个奇怪的情况显示SQL服务器的值。 SQL Server 2008字段中存储了一个值,当从服务器查询并显示在Management Studio中时,该值将被隐藏(见下文)。

测试模板2

但是当在HTML编辑器中显示在屏幕上时,它显示为? (见下文)

测试模板2?

当我检查ascii值时,它显示63.不确定用户如何在SQL服务器中将此特殊值添加到此字段中。当我通过输入测试?进入输入字段并显示它没有任何问题。 我不想盲目地删除此字段中的最后一个字符。我试图确定一个解决方案来识别这个不可见的值,并在存储或显示时删除它。 非常感谢任何解决方案。

如下面的评论所示,结果证明这是Unicode 8203(零宽度空间)。 我的下一个问题是如何在T-SQL中的一个语句中替换此Unicode 8203而不解析每个字符?

2 个答案:

答案 0 :(得分:6)

使用REPLACE删除零宽度空格字符:

-- setup unicode string containing zero-width character
DECLARE @UnicodeReplace NVARCHAR(5) = N'Test' + NCHAR(8203);

-- check that unicode string length is 5,
-- and prove existence of zero-width space character matching unicode 8203
SELECT @UnicodeReplace AS String,
       LEN(@UnicodeReplace) AS Length,
       UNICODE(SUBSTRING(@UnicodeReplace, 5, 1)) AS UnicodeValue

-- replace and prove the unicode string length is reduced to 4
SELECT REPLACE(@UnicodeReplace, NCHAR(8203), N''),
       LEN(REPLACE(@UnicodeReplace, NCHAR(8203), N'')) AS Length;

SQL Fiddle

答案 1 :(得分:0)

如果数据库排序规则具有默认值,例如SQL_Latin1_General_CP1_CI_AS,则无法替换这些字符。在这种情况下,该命令可以工作:

set @ word = replace(@word整理Latin1_General_100_BIN2,nchar(8205),N'')