SQL Server 2008: 替换字符串

6

我有一张表格,在其中一个列中有多行出现错误符号('�')。

以下的TSQL脚本无法解决此问题。

UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, '�', '...')
FROM tblSacrifices S

这个列的数据类型是nvarchar(230),并允许空值。

这些数据来自通过Visual Studio Windows应用程序转换的CSV文件,该文件最初来自Excel。原始数据为“...”,但我认为Word/Excel将其视为一个字符(而不是3个单独的“.”)。当我的应用程序从CSV文件中读取原始字符串时,它(无意中)在提交数据到数据库之前用“�”替换了“...”。

请帮忙解决。


受影响的列是什么数据类型? - Ed Harper
嗨,Ed,它是nvarchar(230)。此外,该列允许为空(如果有区别的话)。 - Chris
5
你能否百分之百确认数据中的符号是黑色带问号的菱形而不仅仅是因为字符集问题导致显示成这样?或者说可能是因为该字符无法在你正在查看的字体中正常显示? - Martin Smith
马丁,你可能有所发现。原始数据是“...”,但我认为Word/Excel将其视为一个字符(而不是3个单独的“.”)。当我的应用程序从CSV文件中读取原始字符串时,它会在提交数据到数据库之前将“...”替换为“�”。 - Chris
4个回答

6

已经弄清楚了。 感谢大家的帮助。

我必须将其转换为二进制。所有Unicode字符超过65500都需要这样做,因为普通的REPLACE()无法正常工作。

UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, nchar(65533) COLLATE Latin1_General_BIN, '...')
FROM tblSacrifices S

你正在用三个字符替换一个字符,这样结果会更长。你不能只使用省略号单个字符 N'…' 吗?(否则我认为你需要使列变宽或使用 LEFT 自行截断或使用 SET ANSI_WARNINGS OFF 忽略错误并允许截断。) - Martin Smith
我明白了,谢谢Martin。我刚刚扩展了该列的最大允许字符数,因为我不想丢失任何数据。 - Chris

1

尝试使用前导 N 明确指定你要搜索的字符是 nvarchar 类型:

UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, N'�', '...')
FROM tblSacrifices S

更新 根据Martin的回答讨论:

我没有理由认为这在功能上与我上面发布的有任何不同,但你可以尝试:

UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(65533), '...')
FROM tblSacrifices S

更新2

在更新我的答案之前,我没有仔细阅读马丁的代码。因为它使用SQL服务器的UNICODE函数来显示结果,所以实际上错误字符被65533掩盖了。

有关Unicode字符65533的详细信息,请参见此处 - 它是坏数据的通用Unicode值。


谢谢 Ed,但这也不起作用。请查看我在原始帖子中回复 Martin 的信息。一些额外的信息可能有助于回答问题。再次感谢。 - Chris
谢谢你们两个。你们可能已经知道那也不起作用。也许有一种方法可以删除“坏数据”,然后再替换,但是我们就不知道该放在哪里了。我卡住了! - Chris

1

编辑:

根据评论中的更新,请尝试使用REPLACE(S.Offering_Details, nchar(65533), '...')

原始答案:

这可能会帮助您进行故障排除

declare @s nvarchar(230)

SELECT @s= ProblemCol
FROM YourTable
WHERE ProblemRowId = X;


set @s = N'日本国'; /*For testing*/


WITH N AS
     (SELECT 1 idx,
             LEFT(@s,1)ch,
             UNICODE(LEFT(@s,1)) C

     UNION ALL

     SELECT idx+1,
            SUBSTRING(@s,idx+1,1),
            UNICODE(SUBSTRING(@s,idx+1,1)) C
     FROM   N
     WHERE  idx<LEN(@s)
     )


  SELECT idx, ch,C
  FROM     N    

测试结果

idx         ch   C
----------- ---- -----------
1           日    26085
2           本    26412
3           国    22269

我现在看到,符号“�”返回了一个值为65533的结果。 - Chris
@Chris - 如果神秘字符的十进制值为65533,我非常有信心,我回答中的脚本应该可以工作。 - Ed Harper
@Ed - 你为什么这么说?select unicode('�')在我的电脑上返回的是63而不是65533。 - Martin Smith
@Martin Smith - 我从 select unicode(N'�') 得到了 65533 - 如果不包括 N,你会得到 '?',它是 63。 - Ed Harper
@Martin - 我已经更新了我的回答并加入了更多细节。但仍然没有修复。 - Ed Harper
显示剩余5条评论

0
使用Unicode函数就像这样,它可能会对你有所帮助:
UPDATE S
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(UNICODE('�')), '...')
FROM tblSacrifices S where S.Offering_Details like '%�%'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接