题
我已经结束了,在我们的MySQL的一列搞砸字符编码。
通常我
√©代替é结果 √∂代替邻点击 √≠代替í
和等等...
相当肯定,这里有人会知道发生了什么,以及如何解决。
<强>更新强> 基于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/ |
+--------------------------+----------------------------+
再次上载的数据,然后最终我得到的数据加载正确(与现有的数据具有可比性)。
解决方案
您文本已经被编码为UTF-8,然后再解码,错误地作为的Mac罗马一>
您将无法修复这个数据库里面,因为MySQL不知道MAC罗马编码。你可能会写一个脚本来走每个受影响的表的每一行,并通过反转编码/解码周期修复了的文字。 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的罗马。最后重新导入转储使用mysql < dump.sql
。
不隶属于 StackOverflow