2

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

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

德国元音变音在数据库中被破坏。应该读的内容例如“ü”显示为“ü”。

由于我知道REPLACE功能,我首先尝试了显而易见的:

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

这给了我预期的结果。

接下来我尝试替换它们:

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

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

因此,即使对编码了解很多,我仍然无法弄清楚如何解决这个问题(或者是否有可能)。

我的问题:

如何使用该REPLACE功能替换损坏的德语变音符号?

4

3 回答 3

3

为了回答我自己的问题,链接的可能副本为我指明了某个方向,但对我来说不是正确的解决方案。

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

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

之后,我可以成功执行我的语句,例如

UPDATE `mydb`.`mytable` SET `mycolumn` = REPLACE(`mycolumn`, 'ü', 'ü');
于 2013-02-25T17:11:04.390 回答
2

您的“元音变音”没有损坏!这些只是编码为 utf-8,因此您的“带有两个点的 u”会产生 utf-8 2 字节序列。这没有什么错。您的问题是您的查看器可能以 ANSI 编码(iso-8859-1)显示,这导致字节和字符之间的关系为 1:1。但是,查看器必须“解码” utf-8 序列以获取字符的代码点,否则它将仅显示 utf-8 起始字节以及后续字节/s 作为它在 ANSI 中表示的字符。我敢打赌,您的视图未配置为查看 utf-8 编码文本。只需根据需要进行配置即可。

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

于 2013-11-29T13:09:50.207 回答
1

恕我直言,MySQL 存储üü使用 UTF-8 排序规则utf8_general_ci或更好是正确的utf_unicode_ci(讨论为什么更喜欢utf8_unicode_ci

现在,重要的是如何在将 UTF 编码的 SQL 字符串打印到 HTML、Android 或 iOS 等前端之前对其进行解码。

HTML

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

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

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

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

安卓

安卓使用的情况下

Html.fromHtml(String).toString();

iOS

在 iOS 使用的情况下

(NSString *)stringByDecodingHTMLEntities;
于 2018-04-05T08:19:49.490 回答