Unr*_*son 2 mysql character-encoding mojibake
我最终在我们的一个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')),
Run Code Online (Sandbox Code Playgroud)
之后
load data infile 'file-fixed.csv'
into table list1
fields terminated by ','
optionally enclosed by '"'
ignore 1 lines;
Run Code Online (Sandbox Code Playgroud)
正确导入数据.
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/ |
+--------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)
该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/ |
+--------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)
再次上传数据然后我最终正确加载数据(与现有数据相比).
您的文本已编码为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')
í
Run Code Online (Sandbox Code Playgroud)
或者,如果没有不受此问题影响的非ASCII内容,您可以尝试使用mysqladmin
导出SQL转储,然后使用上面的脚本一次转换它,或者,如果您有文本编辑器(大概是在Mac上)可以做到这一点,将脚本加载为UTF-8然后将其保存为Mac Roman.最后使用重新导入转储mysql < dump.sql
.
归档时间: |
|
查看次数: |
1687 次 |
最近记录: |