替换MySQL中的奇怪字符

时间:2012-12-19 12:12:12

标签: mysql character-encoding

我的一些文字显示得很奇怪,我需要替换它上面的一些字符。但是我遇到一个特定的字符有问题,以下一个(javascript代码,以显示字符之间的区别):

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

在MySQL中,我尝试应用以下查询:

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

但它会影响0行。因此问题是,将这些奇怪的字符替换为正确的字符的正确查询是什么?

更新

奇怪的字符显示如下(正方形):

Weird char, displayed as square

在JSON中,它被编码为\u0096而不是-

2 个答案:

答案 0 :(得分:3)

就像Alvaro所说,你应该尝试将数据库更改为正确的字符集。通常,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

答案 1 :(得分:2)

这看起来不像charset而是整理相关。整理定义了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, '–', '-' );

<强> CORRECTION: REPLACE比较始终使用二进制排序规则

完成

修改

如果仍然更新0行,则可能不会替换正确的字符。 将包含该字符的字符串转换为十六进制并发布十六进制值,以便我们可以找出我们正在讨论的字符

e.g。

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' ) );