mssql选择错误编码的所有nvarchar

时间:2019-04-29 13:12:35

标签: sql sql-server encoding

我正在使用一个旧数据库,在该数据库中有人在将数据插入数据库之前未正确编码数据。产生类似

的文字

“错误的txt”(在我的情况下,'``是ø)。

我正在寻找一种方法来查找列中包含此类数据的所有行,以便我可以对其进行纠正。

到目前为止,我尝试使用

这样的正则表达式
SELECT * FROM table WHERE ([colm] not like '[a-zA-Z\s]%') 

但是无论我做什么,我都无法找到只选择包含'。'的方式的方法。

类似

的搜索
    SELECT * FROM table WHERE ([colm] like '%�%') 

也不会返回任何内容。 (尝试过,以防万一)。

我一直在Google以及Stackoverflow上进行搜索,但是没有人遇到这个问题,或者我正在搜索错误的内容。

因此,如果有人乐于帮助我,我会很高兴。

感谢您的时间。

4 个答案:

答案 0 :(得分:1)

尝试一下:

WHERE [colm] not like N'%[a-zA-Z]%'

当然,这应该返回带有数字,空格和标点符号的值。

答案 1 :(得分:1)

正如Jeroen所说,使用binary似乎是可行的方法。就个人而言,我建议在这里使用NGrams4k,但我建立了一个快速提示表来代替工作:

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2, N N3, N N4)
SELECT V.Colm
FROM (VALUES(N'Wrong t�xt" (in my case the ''�'' is a ø)'),
            (N'This string is ok'))V(colm)
     JOIN Tally T ON LEN(V.Colm) >= T.I
     CROSS APPLY (VALUES(SUBSTRING(V.Colm,T.I,1))) SS(C) 
GROUP BY V.colm
HAVING COUNT(CASE CONVERT(binary(2),SS.C) WHEN 0xFDFF THEN 1 END) > 0;

答案 2 :(得分:1)

假设字符串中的字符确实是U+FFFD REPLACEMENT CHARACTER(�),并且由于其中实际上存在其他无法正确解码的字节,因此不会显示为替换字符,您可以使用< / p>

SELECT * FROM table WHERE [colm] LIKE N'%�%' COLLATE Latin1_General_BIN2

或者(以避免编码变形字符的任何其他问题)

SELECT * FROM table WHERE [colm] LIKE N'%' + NCHAR(0xfffd) + N'%' COLLATE Latin1_General_BIN2

之所以需要Unicode,是因为......在任何单字节排序规则中都不存在,并且由于常规的排序规则将''视为根本不在字符串中出现,所以需要二进制排序规则。

答案 3 :(得分:0)

您可以替换U+FFFD REPLACEMENT CHARACTER(�)的出现并将其与原始值进行比较:

SELECT *
, CASE WHEN CONVERT(VARBINARY(MAX), t.colm) = CAST(REPLACE(CONVERT(VARBINARY(MAX), t.colm), 0xFDFF, 0x) AS VARBINARY(MAX)) THEN 1 ELSE 0 END AS EncodingCorrect
FROM (
    SELECT N'Wrong t�xt" (in my case the ''�'' is a ø)' AS colm
    UNION ALL
    SELECT 'Correct text'
    UNION ALL
    SELECT 'Wrong t?xt" (in my case the ''?'' is a ø)'
) t

@Jeroen Mostert 的建议WHERE colm LIKE N'%�%' COLLATE Latin1_General_BIN2似乎是更好,更易读的解决方案。