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

问题描述 投票:2回答:3

(我不小心在DNA中问了这个问题,但在常见问题解答中找到了这里的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函数来替换破碎的德国变音符号?

mysql encoding utf-8 replace
3个回答
2
投票

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

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

  1. 右键单击树中的表。
  2. 选择“编辑”
  3. 将“默认排序规则”的下拉值更改为“latin_german1_ci”。没有勾选“转换数据”复选框。
  4. 单击底部的“保存”按钮。
  5. 将“默认排序规则”的下拉值更改为“utf8_general_ci”。没有勾选“转换数据”复选框。
  6. 单击底部的“保存”按钮。

在那之后,我可以成功执行我的陈述,例如

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

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。


1
投票

恕我直言,MySQL使用UTF-8校对ü或更好的üutf8_general_ci存储为utf_unicode_ci是正确的。 (Discussion on why to prefer utf8_unicode_ci)

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

HTML

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

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

如果没有,那么在PHP的情况下,在打印之前将变量包装在utf_decode()函数中。

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

Android的

在Android使用的情况下

Html.fromHtml(String).toString();

iOS版

在iOS使用的情况下

(NSString *)stringByDecodingHTMLEntities;
© www.soinside.com 2019 - 2024. All rights reserved.