我的一些文字显示得很奇怪,我需要替换它上面的一些字符。但是我遇到一个特定的字符有问题,以下一个(javascript代码,以显示字符之间的区别):
<script>
alert('–'.charCodeAt(0) + ':' + '-'.charCodeAt(0));
</script>
在MySQL中,我尝试应用以下查询:
UPDATE translation SET columnx = REPLACE(columnx, '–', '-');
但它会影响0行。因此问题是,将这些奇怪的字符替换为正确的字符的正确查询是什么?
更新
奇怪的字符显示如下(正方形):
在JSON中,它被编码为\u0096
而不是-
答案 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.html 和 https://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' ) );