包含UTF8字符的旧条目在UTF8数据库中保存不正确

时间:2012-06-04 20:35:29

标签: 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条记录是不可行的。

2 个答案:

答案 0 :(得分:5)

看起来您之前已在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;
    

答案 1 :(得分:0)

您可以在MYSQL中使用REPLACE函数。

像 -

`UPDATE cities
 SET name = REPLACE(name, 'ö', 'ö');`