我正在使用一个旧数据库,在该数据库中有人在将数据插入数据库之前未正确编码数据。产生类似
的文字“错误的txt”(在我的情况下,'``是ø)。
我正在寻找一种方法来查找列中包含此类数据的所有行,以便我可以对其进行纠正。
到目前为止,我尝试使用
这样的正则表达式SELECT * FROM table WHERE ([colm] not like '[a-zA-Z\s]%')
但是无论我做什么,我都无法找到只选择包含'。'的方式的方法。
类似
的搜索 SELECT * FROM table WHERE ([colm] like '%�%')
也不会返回任何内容。 (尝试过,以防万一)。
我一直在Google以及Stackoverflow上进行搜索,但是没有人遇到这个问题,或者我正在搜索错误的内容。
因此,如果有人乐于帮助我,我会很高兴。
感谢您的时间。
答案 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
似乎是更好,更易读的解决方案。