4

我的一些文本显示得很奇怪,我需要替换一些字符。但是我在使用特定字符时遇到问题,以下字符(javascript代码,以显示字符之间的区别):

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

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

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

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

更新

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

奇怪的字符,显示为正方形

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

4

2 回答 2

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.html 和 https://dba.stackexchange.com/questions/ 9944/mysql-transfer-iso-8859-1-to-utf-8

于 2012-12-19T12:22:36.570 回答
2

这看起来不是字符集,而是与排序规则相关。排序规则定义了 MySQL 在排序或比较时如何处理“几乎相等”的字符。

例如,iso-8859-15 默认排序规则将处理ü = u

您可以做的是将您的字段视为 bin 排序规则。二进制排序规则不会将相似字符视为相等。

选择正确的二进制排序规则

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;

编辑2:

刚刚看到,您实际上说您得到\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' ) );
于 2012-12-19T13:07:08.940 回答