mysql - 包含 UTF8 字符的旧条目错误地保存在 UTF8 数据库中

标签 mysql unicode

好的,所以我已经确保我的MySQL(5.1.61)数据库是UTF8,表是UTF8,字段是UTF8,并且MySQL客户端的字符集设置为UTF8。我可以成功存储和检索 UTF8 条目。我还确保我的终端编码设置为 UTF8。

CREATE TABLE `cities` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

涉及数据库中已存在的 200,000 个条目时出现的问题。看来我们继承该项目的人搞乱了很多编码,实际上将像 Hörby 这样的字符串保存为 Hörby 其中 à 是有效的 UTF8 字符。也就是说,MySQL 正在接收 Hörby 的 UTF8 字符串,并按原样存储它。下面是一个示例,其中第一个条目是旧条目之一,第二个条目是我们将“Hörby”插入数据库,并将所有内容设置为 UTF8:

mysql> INSERT INTO cities SET name = 'Hörby';
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM cities;
+----------+
| name     |
+----------+
| Hörby   | <--- old entry
| Hörby    | <--- new entry
+----------+

我们怎样才能将被压扁的角色恢复到原来的样子?此时我们已经准备好采取任何措施,但重新输入所有 200,000 条记录是不可行的。

最佳答案

看起来您之前已将 utf8 编码的字符串存储在 latin1 列中,然后将该列转换为 utf8。要解决这个问题:

  1. 将数据转换回 latin1:

    ALTER TABLE cities MODIFY name varchar(255) CHARACTER SET latin1;
    
  2. 将列类型更改为 UTF-8,而不更改数据(通过 binary):

    ALTER TABLE cities MODIFY name varchar(255) CHARACTER SET binary;
    ALTER TABLE cities MODIFY name varchar(255) CHARACTER SET utf8;
    

关于mysql - 包含 UTF8 字符的旧条目错误地保存在 UTF8 数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10887985/

相关文章:

javascript - 将 HTML DOM 值插入数据库

mysql - 获取 MySQL 运行的 ip_adress 和 port_number

mysql - 如何用字符串+ColY数据+字符串更新所有ColX

java - 使用正则表达式删除java中转义的unicode字符串

mysql - 有没有办法在运行规范时停止增加 mysql 中的自动增量值?

mysql - 表中不存在键列,但我发誓它确实存在

python - 如何使用 PyPdf 将 Pdf 转换为 Unicode (utf-8) 格式的文本

Python 2.7 如何打印 unicode-escape 格式字符串?

javascript - 如何仅遍历我实际看到的字符串中的字符?

python - PyGame 中的 Devanagari 文本呈现不正确