2012-12-19 62 views
4

我的一些文本显示奇怪,我需要替换它上面的一些字符。但是我有一个特定的字符,下面的一个麻烦(javascript代码,以显示字符的区别):在MySQL中替换奇怪的字符

<script> 
alert('–'.charCodeAt(0) + ':' + '-'.charCodeAt(0)); 
</script> 

在MySQL中我尝试应用下面的查询:

UPDATE translation SET columnx = REPLACE(columnx, '–', '-'); 

但它影响0行。所以问题是,什么是正确的查询来取代这些奇怪的字符到正确的?

UPDATE

怪异炭显示这样的(方形):

Weird char, displayed as square

在JSON,它被编码为\u0096代替-

+0

...或者你可以解决根本问题,并让你的字符显示“正常”。 –

+0

有一种机制可以接受这些文本(全部在ISO-8859-1中),使用UTF-8对它们进行编码,从它们生成JSON并将它们显示在JSON的另一侧,它们显示为正方形。我无法控制这一点,并被要求更正数据库。我已经在其他字符上取代了,例如''''替换为'''但是没有这个特定的运气。 – RedDragon

+0

祝你好运。你基本上被卡住了7位ASCII码。 –

回答

2

这看起来不是字符集,但整理有关。排序规则定义了MySQL在分类或比较时如何将字符视为“几乎相等”。

例如,ISO-8859-15默认排序规则将治疗ü = u

你可以做的是把你的领域就像一个箱子整理。 二进制排序规则不会将相似字符视为相等。

选择正确的二进制排序

SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLLATIONS WHERE COLLATION_NAME LIKE '%bin%'; 

然后执行你这样的更新:

UPDATE TABLE SET columnx = REPLACE(columnx COLLATE latin1_bin, '–', '-'); 

更正: 更换比较使用二进制排序

编辑总是做:

如果仍然有0行更新,您可能不会替换正确的字符。 转换包含字符为十六进制,并张贴十六进制值,所以我们可以找出哪些烧焦我们正在谈论

例如串

SELECT HEX(columnx) LIMIT 1; 

EDIT2:

刚刚看到,你居然说你\u0096这是一个控制字符称为START OF GUARDED AREA ..什么都设定此角色创造了..在六角这是0xC2 0x96。 在您的示例查询中,您将替换名为EN DASH的字符集

只需粘贴它即可替换控制字符,转换可能会将其分解。相反,你可以使用UNHEX(hexval)来告诉MySQL的字符你的意思是

UPDATE TABLE SET columnx = REPLACE(columnx UNHEX('C296'), '-'); 

,或者使这更清楚(或更加混乱:)),这可以通过“正常”的连字符的十六进制值以及

UPDATE TABLE SET columnx = REPLACE(columnx UNHEX('C296'), UNHEX('2D')); 
3

像阿尔瓦罗说,你应该真的尝试将数据库更改为正确的字符集。通常utf-8字符集应该足够了。

更多信息请看这里: http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

如果你没有权利这样做,也许看看: http://dev.mysql.com/doc/refman/5.1/de/charset-convert.htmlhttps://dba.stackexchange.com/questions/9944/mysql-transfer-iso-8859-1-to-utf-8

+0

这将涉及到更改他们访问数据库的所有系统,我认为这在我们的情况下不是可行的。 – RedDragon

+0

如果我没有问题,甚至不能解决问题 –