如何用MySQL REPLACE函数替换破碎的德语变音符号?

时间:2013-02-25 15:21:34

标签: mysql encoding utf-8 replace

(我在DBA上首先提出了这个问题,但在常见问题解答中发现,在SO上提出SQL问题)

我正在尝试“修复”从编码损坏的SQL文本文件导入的MySQL数据库(UTF-8排序规则)。

即。 German umlauts在数据库中被破坏了。应阅读什么,例如“ü”显示为“Ô。

由于我知道REPLACE function,我首先尝试了显而易见的事实:

SELECT * FROM `mydb`.`mytable` WHERE `mycolumn` LIKE '%ü%';

这给了我预期的结果。

接下来我试图替换它们:

UPDATE `mydb`.`mytable` SET `mycolumn` = REPLACE(`mycolumn`, 'ü', 'ü');

令我惊讶的是,这导致零行受影响。

所以即使knowing a lot about encoding,我仍然无法弄清楚如何解决这个问题(或者根本不可能)。

我的问题:

如何使用REPLACE函数替换破碎的德国变音符号?

3 个答案:

答案 0 :(得分:2)

要回答我自己的问题,linked possible duplicate指出了我的方向,但对我来说不是正确的解决方案。

相反,我执行了以下步骤(使用HeidiSQL):

  1. 右键单击树中的表格。
  2. 选择“编辑”
  3. 将“默认排序规则”的下拉值更改为“latin_german1_ci”。 勾选“转换数据”复选框。
  4. 点击底部的“保存”按钮。
  5. 将“默认排序规则”的下拉值更改为“utf8_general_ci”。 勾选“转换数据”复选框。
  6. 点击底部的“保存”按钮。
  7. 之后,我可以成功执行我的陈述,例如。

    UPDATE `mydb`.`mytable` SET `mycolumn` = REPLACE(`mycolumn`, 'ü', 'ü');
    

答案 1 :(得分:2)

你的'变形虫'没有破碎!这些只是编码为utf-8,所以你的'带两个点'会导致utf-8 2字节序列。这没什么不对。您的问题是您的查看器可能以ANSI编码(iso-8859-1)显示,这导致字节和字符之间的关系为1:1。然而,观众必须“解码”utf-8序列以获得字符的代码点,否则它将简单地显示utf-8起始字节以及后续字节/ s作为它在ANSI中表示的字符。我敢打赌你的视图没有配置为查看utf-8编码的文本。只需根据需要进行配置即可。

让你的'u with two dots'进行utf-8编码,然后全世界的每个观众都可以解码它的代码点,这是一个独特的unicode代码点。请记住,如果您的“带有两个点的u”是ANSI编码的,当使用不同的ANSI编码显示时,它可能会显示不同的字符,例如iso-8859-5。

答案 2 :(得分:1)

恕我直言,MySQL使用UTF-8归类 ü 或更好 ü utf8_general_ci存储为utf_unicode_ci是正确的EM>。 https://www.nopcommerce.com/boards/t/50136/overriding-controller-and-view-in-nopcommerce-40.aspx#202614

现在,重要的是如何解码UTF编码的SQL字符串,然后再将其打印到HTML,Android或iOS等前端。

<强> HTML

如果是HTML,请在HTML页面的<head>部分设置utf-8字符集,德语字符ü将正确显示。

<head>
    <meta charset="UTF-8"/>
    ...
</head>

如果没有,那么在PHP打印之前将PHP包装在utf_decode()函数中。

注意:如果您没有在PHP中使用PHP,请使用您选择的语言查找utf-8解码功能。

<强>的Android

如果使用Android

Html.fromHtml(String).toString();

<强>的iOS

如果使用iOS

(NSString *)stringByDecodingHTMLEntities;