2012-02-13 67 views
1

我的数据库在latin1中,并且全部是â"'��"'(取决于我的终端分别设置为latin1还是unicode)。从上下文来看,我认为他们应该是emdashes。在IE中呈现(或不呈现)时,它们似乎会导致令人讨厌的错误。我想找到并替换它们。问题是这两个字符都不符合replace。运行查询:替换mysql中的垃圾字符

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

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

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

编辑:

我已经分离出的坏字符hexdump,它的E2 80(我不认为这对应于任何Unicode字符)。我怎样才能把它提供给替换函数?

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

什么也没做。

+0

它是拉丁文1的理由吗?我倾向于现在默认使用unicode,并不难转换 - 只需将数据库转储到SQL,然后将其重新加载到使用utf8的新数据库中。 – 2012-02-13 22:10:47

+0

我继承了它。转储是不可取的,因为它会导致我想避免的显着的停机时间。我一直在阅读像http://nicj.net/2011/04/17/mysql-converting-an-incorrect-latin1-column-to-utf8这样的就地方法,但还没有时间去适应它到我的分贝。 – mmdanziger 2012-02-13 22:32:23

+0

您可能别无选择,只能查找包含此错误字符序列的所有行,并手动制作单个语句来修复每个行(但脚本可以帮助完成此操作)。 – staticsan 2012-02-13 23:25:55

回答

1

我想通了。我用mysql的内置函数hex来转储一个我知道不好的条目。

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

然后挑出来的话(夹在“20” S这些数字),发现我违规设置的字节实际上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','--'); 

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

+0

'x'C3A2''对于''是UTF-8; 'x'E282AC''是UTF-8的'€'; 'x'2671756F743B''是'"'的ASCII码,所以有些东西在做Unicode编码... – Neil 2012-02-14 22:07:42

+0

@Neil我认为这个故事是文本是用一些MS cp1252(或不同的MS方案??)编写的,然后无效转换到UTF8并转储到latin1列中。 cp1252 en/em短划线不能很好地复制到UTF8,所以无论转换它为什么看起来像是任意的垃圾......但cp1252和E2 80 93(E2)中的en(em)破折号是96(97) 94)以UTF8格式...不知道这些变成了c3a2e82ac ...... – mmdanziger 2012-02-15 08:59:57

+0

E2 80 94是在Windows-1252中的“ - ”,也许这个智能报价变成了“"”。 – Neil 2012-02-15 21:52:37

0

某些东西可能已经提交了带有UTF-8编码(E2 80 94)的em破折号(U + 2014),您现在正在尝试将其解释为latin-1,但这在拉丁文中不适用,不包括范围80-9F,因此您可能会看到非法字节的Unicode替换字符,因此在显示时会导致â��。通过Windows-1252中的比较,它将显示为—。您可以使用CHAR(0xE2, 0x80, 0x94)创建搜索字符串。

+0

你的回答让我朝着正确的方向发展,我发现糟糕的角色是'e2 80'。但是,我如何形成替换查询?这不是我期望的那样。 – mmdanziger 2012-02-13 23:20:43

+0

其实......这不是e2 80.请参阅下面的问题解决方案。 – mmdanziger 2012-02-14 21:08:52