替换mysql中的垃圾字符

时间:2012-02-13 21:55:06

标签: mysql character-encoding latin1

我的数据库位于latin1并且已满â"'��"'(取决于我的终端是分别设置为latin1还是unicode)。从背景来看,我认为它们应该是emdashes。它们在IE中渲染(或不渲染)时似乎会造成令人讨厌的错误。我想找到并替换它们。问题是â€和 字符都与replace不匹配。运行查询:

    update TABLE set COLUMN = replace(COLUMN,'��"','---');

执行没有错误但不执行任何操作(更改了0行)。我很清楚,当我在终端中复制时,“钻石中的问号”字符是不匹配的。有没有办法找出它的代码并通过它或其他东西匹配它? mysql控制台非常接近能够在一行中执行此操作,因此如果可以避免,我宁愿不在终端外编写脚本。

db是托管Amazon RDS的,因此我无法安装我在其他问题中引用的regexp udf。从长远来看,我将不得不将整个数据库正确转换为utf8,但我需要立即修复此渲染问题。

编辑:

我用hexdump隔离了坏字符,它是e2 80(我不认为这对应于任何unicode字符)。如何将其提供给替换功能?

    update TABLE set COLUMN = replace(COLUMN, char(0xe2,0x80),'---');

什么都不做。

2 个答案:

答案 0 :(得分:1)

我明白了。我使用mysql的内置hex函数来转储我知道不好的条目。

    select hex(column) from table where id=666;

然后挑出单词(夹在“20”之间的那些数字)并发现我的违规字节集实际上是x'C3A2E282AC2671756F743B'。这与我在PHP和我的系统中编码的方式相对应(我e2 80)我不知道,在这一点上,我并不在乎。

要在销毁数据之前验证,请将其重新插入mysql:

    select x'C3A2E282AC2671756F743B';
    +---------------------------+
    | x'C3A2E282AC2671756F743B' |
    +---------------------------+
    | â€"               |
    +---------------------------+
    1 row in set (0.00 sec)

因此,使用上面的替换查询,我能够立即清除所有不良数据。

记录是:

    update TABLE set COLUMN = replace(COLUMN, x'C3A2E282AC2671756F743B','--');

我真的希望这对某人有用。尽管在mysql中编码snafus似乎很常见,但我搜索无处不在,我无法找到对这个最终相当简单的过程的解释。

答案 1 :(得分:0)

某些东西可能已经提交了带有UTF-8编码的em破折号(U + 2014)(E2 80 94),您现在试图将其解释为latin-1,但这在latin-1中无效,但不包括范围80-9F,因此您可能会看到非法字节的Unicode替换字符,因此在显示时会导致â��。通过在Windows-1252中进行比较,它将显示为—

您可以使用CHAR(0xE2, 0x80, 0x94)创建搜索字符串。