【问题标题】:(T)SQL Query to filter all datasets, which contain �(T)SQL 查询过滤所有数据集,其中包含 �
【发布时间】:2014-02-14 00:41:42
【问题描述】:

我刚刚收到一个 (MSSQL) 数据库,不幸的是其中的数据已损坏。 在某些数据集中,德语特殊字符 (ä/ü/ö) 被替换为 � 符号 (Unicode: \uFFFD)。

这不是整理或使用各种编码或任何东西(我已经检查过)的问题,而是提供原始数据的人的错,因为我很确定这些符号被“硬编码”到数据意味着它们“总是”在那里,并且可能是由于数据提供者的迁移失败(或类似的事情)而存在的。

由于我无法在没有这些错误的情况下进行正确的转储,因此我目前正在寻找仅选择受影响的数据集的可能性。我已经尝试过 [...] WHERE LIKE '%\uFFFD%' 语句(希望数据库在内部将这些符号解码为 un​​icode 代码),但无济于事。 [...] WHERE LIKE '%�%' 部分工作,因为它显示所有受影响的列,但也显示所有包含正常的数据集?字符(这使我无法使用此方法,因为输出太大了)。

有谁知道是否有可能专门只选择包含 � 的数据集?

最好的问候, 咻咻咻

【问题讨论】:

  • 如果您在查询中添加“N”会怎样? WHERE LIKE N'%�%' 这会将文本显式转换为 unicode。 (作为快速修复:找到一个根本不使用的字符,将所有正常的 ? 字符替换为该字符,找到特殊情况,处理它们,然后完成后,将特殊字符改回 ?)
  • 与没有 N 的 2155 相比,添加 N 得到 43260 个结果 :) 不过我会考虑那个 Quickfix(我怀疑它会很快:P)
  • 我认为@GarethD 在下面显示 unicode 不能很好地与 like 语句配合使用。 Charindex 前景广阔。

标签: sql sql-server tsql unicode encoding


【解决方案1】:

结果将取决于您的排序规则设置。我能够让它与几个不同的一起工作。我认为最通用的是这个:

SELECT  *
FROM    (VALUES (N'A�A'), (N'A?A'), (N'AAA'), (N'�A'), (N'A�'), (N'�')) t (c)
WHERE   CHARINDEX(N'�' COLLATE Latin1_General_BIN, C) > 0;

或者

SELECT  *
FROM    (VALUES (N'A�A'), (N'A?A'), (N'AAA'), (N'�A'), (N'A�'), (N'�')) t (c)
WHERE   C LIKE N'%�%' COLLATE Latin1_General_BIN;

当使用 LIKE 时,它似乎只适用于使用二进制排序的排序规则(尽管我还没有尝试过所有排序规则!)。您可以使用以下方法获得这些:

SELECT name, description
FROM fn_helpcollations()

【讨论】:

  • 谢谢,这似乎在第一次看起来有效。但是,我只得到了 29 个结果集,这个查询太少了(我也看不到那里有一些我知道存在 � 的条目)。我将进一步检查 CHARINDEX 函数,并再次查看原始数据。会不会有几个不同的 unicode 代码会导致显示一个 �?
  • 我刚刚发现这个有它的缺陷,例如SELECT CHARINDEX(N'�', N'A�')返回0。我对此很感兴趣,所以我会继续研究!
  • 有道理。我得到的所有结果在字符串的第一个字符中都有�。非常感谢您的帮助:)
  • 谢谢伙计,现在工作得很好,我很确定我现在已经拥有了所有需要的数据集。让我手动修复 476 行:/
猜你喜欢
  • 1970-01-01
  • 2014-08-15
  • 2013-12-28
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多