【问题标题】:Fixing encodings修复编码
【发布时间】:2011-04-18 21:45:26
【问题描述】:

我在我们的 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;

正确导入数据。

更新 2: 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 TABLEDEFAULT 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/ | 
+--------------------------+----------------------------+

再次上传数据,最后我正确加载了数据(与现有数据相当)。

【问题讨论】:

  • 目前使用的是什么编码?数据是如何插入的?
  • 回显 NullUserException,请发布SHOW CREATE TABLE TableName 的输出。也请发布SHOW VARIABLES LIKE 'character_set%'的输出。
  • @Hammerite,NullUserException,感谢您的输入...
  • 很高兴您解决了问题。

标签: mysql character-encoding mojibake


【解决方案1】:

您的文本已被编码为 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重新导入转储。

【讨论】:

  • 谢谢您,先生...我会用解决方案更新问题;我实际上有文件中的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多