2012-06-04 52 views
2

好的,所以我确保我的MySQL(5.1.61)数据库是UTF8,表格是UTF8,字段是UTF8,MySQL客户端的字符集设置为UTF8。我可以成功地存储和检索UTF8条目。我还确保我的终端的编码设置为UTF8。包含UTF8字符的旧条目在UTF8数据库中保存不正确

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

问题涉及到数据库中已存在的200,000个条目。看起来我们继承了这个项目的人搞砸了很多编码,实际上保存了一个字符串,如HörbyHörby,其中Ã是有效的UTF8字符。也就是说,MySQL正在接收一个UTF8字符串Hörby,并将其存储为。这里就是第一个条目是旧条目的一个例子,第二个是我们将“Hörby”与一切将数据库设置为UTF-8:

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

+0

你有什么办法确定哪些记录是“旧”记录(在数据库更改之前),哪些记录是“新”? – eggyal

+0

@eggyal:是的,大约99%的数据库包含旧记录。我们可以在此时手动重新添加新条目。 – JustinBull

回答

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; 
    
0

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

喜欢的东西 -

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

不幸的是,这会涉及到找到所有不好的角色,弄清楚他们应该是什么,然后为每个不好的角色写一个REPLACE。 – JustinBull

+0

没有其他选择。你如何告诉MySQL这是好的,保持它,这是不好的,取而代之呢? – JHS

相关问题