我的数据库位于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),'---');
什么都不做。
答案 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)
创建搜索字符串。