一尘不染

固定编码

mysql

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

编辑3:

实际上,使用上述设置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/ | 
+--------------------------+----------------------------+

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


阅读 283

收藏
2020-05-17

共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上为Mac)),将脚本加载为UTF-8,然后将其另存为Mac Roman。最后,使用重新导入转储mysql < dump.sql

2020-05-17