2010-09-29 50 views
2

我已经结束了在我们的mysql列中的一个乱七八糟的字符编码。修复编码

通常我有√©的

代替é
√∂代替邻
√≠的相反,我

等等...

相当肯定,这里有人会知道发生了什么事以及如何解决。

UPDATE: 基于bobince的答案,因为我在一个文件中有这样的数据我做以下

#!/user/bin/env python 
import codecs 
f = codecs.open('./file.csv', 'r', 'utf-8') 
f2 = codecs.open('./file-fixed.csv', 'w', 'utf-8') 
for line in f: 
    f2.write(line.encode('macroman').decode('utf-8')), 

后其

load data infile 'file-fixed.csv' 
into table list1 
fields terminated by ',' 
optionally enclosed by '"' 
ignore 1 lines; 

正确导入数据。

UPDATE2: Hammerite,只是为了完整性这里有所需的详细信息...

mysql> SHOW VARIABLES LIKE 'character_set%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

SHOW CREATE TABLE因为我导入到表有DEFAULT CHARSET=utf8

EDIT3:

其实用上面的设置load没有做正确的事情(我无法比较现有的utf8字段,我的加载数据只有看起来像,就好像它加载正确;我想是因为的错,但配套客户端,连接和结果字符集),所以我的设置更新为:再次

+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

上传的数据,最后我得到了数据正确加载(与现有的数据具有可比性)。

+0

它目前使用什么编码?数据如何被插入? – NullUserException 2010-09-29 15:48:35

+0

回声NullUserException,请发布'SHOW CREATE TABLE TableName'的输出。请同时发布'SHOW VARIABLES LIKE'character_set%''的输出。 – Hammerite 2010-09-29 16:11:00

+0

@Hammerite,NullUserException,感谢您的输入... – Unreason 2010-09-30 08:31:38

回答

5

您的文本已被编码为UTF-8,然后错误地重新解码为Mac Roman

由于MySQL不知道Mac Roman编码,所以无法在数据库中修复此问题。您可以编写脚本来遍历每个受影响的表格的每一行,并通过反转编码/解码循环来修复文本。 Python是一种可能性,有一个良好的范围编码的:

>>> print u'é'.encode('macroman').decode('utf-8') 
é 
>>> print u'ö'.encode('macroman').decode('utf-8') 
ö 
>>> print u'í'.encode('macroman').decode('utf-8') 
í 

或者,如果没有非ASCII内容,通过这个问题是不受影响的,你可以尝试使用mysqladmin导出一个SQL转储,然后将其转换不管是使用上面的脚本,还是如果你有一个可以做到的文本编辑器(大概是在Mac上),将脚本加载为UTF-8,然后将其保存为Mac Roman。最后使用mysql < dump.sql重新导入转储。

+0

谢谢你,先生......我会用解决方案更新这个问题;我实际上在文件中有数据 – Unreason 2010-09-30 08:08:19