MySQL将latin1数据转换为UTF8

时间:2009-09-17 19:20:02

标签: sql mysql collation load-data-infile

我使用LOAD DATA INFILE将一些数据导入MySQL数据库。表本身和列使用UTF8字符集,但数据库的默认字符集是latin 1.因为数据库的默认字符类型是latin1,并且我使用了LOAD DATA INFILE而没有指定字符集,所以它被解释文件为latin1,即使文件中的数据是UTF8。现在我的UTF8列中有一堆编码错误的数据。我发现this article似乎解决了类似的问题,即“在cp1251中插入了UTF8”,但我的问题是“在UTF8中插入了Latin1”。我已经尝试在那里编辑查询以将latin1数据转换为UTF8,但无法使其工作。数据与之前的数据相同,甚至更多。举个例子,Québec这个词显示为Québec。

[其他信息]

选择包含在HEX()中的数据时,Québec的值为5175C383C2A9626563。

此表的创建表(缩写)是。

CREATE TABLE MyDBName.`MyTableName`
(
`ID` INT NOT NULL AUTO_INCREMENT, 
.......
`City` CHAR(32) NULL, 
.......
`)) ENGINE InnoDB CHARACTER SET utf8;

7 个答案:

答案 0 :(得分:11)

我在旧的wordpress安装中遇到过这样的情况,问题是数据本身已经在Latin1数据库中的UTF-8中(由于WP默认字符集)。这意味着不需要转换数据,而是ddbb和表格格式。 根据我的经验,在进行转储时,事情会变得混乱,因为我知道MySQL将使用客户端的默认字符集,在许多情况下它现在是UTF-8。 因此,确保使用相同的数据编码进行导出非常重要。对于带有UTF-8编码的Latin1 DDBB:

$ mysqldump –default-character-set=latin1 –databases wordpress > m.sql

然后在重新导入到UTF-8中的新数据库之前替换导出的转储中的Latin1引用。排序:

$ replace "CHARSET=latin1" "CHARSET=utf8" \
    "SET NAMES latin1" "SET NAMES utf8" < m.sql > m2.sql

就我而言this link非常有帮助。 评论here in spanish

答案 1 :(得分:7)

虽然对于OP来说几乎不存在,但我碰巧在ALTER TABLE的MySQL文档中找到了解决方案。我在这里发布它只是为了将来参考:

  

警告

     

CONVERT TO操作可在字符集之间转换列值。如果您在一个字符集中有一个列(如latin1),那么这不是您想要的,但存储的值实际上使用了一些其他不兼容的字符集(如utf8)。在这种情况下,您必须为每个此类列执行以下操作:

ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
  

这样做的原因是当您转换为BLOB列或从BLOB列转换时没有转换。

答案 2 :(得分:2)

LOAD DATA INFILE允许您设置编码文件应该在:

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

答案 3 :(得分:2)

我为拉丁数据库写了http://code.google.com/p/mysqlutf8convertor/到UTF-8数据库。所有表格和字段都要更改UTF-8。

答案 4 :(得分:1)

将latin1转换为UTF8不是你想要做的,你需要相反的。

如果真的发生了这件事:

  1. UTF-8字符串被解释为Latin-1并转码为UTF-8,并将其重命名。
  2. 您现在或可能正在阅读没有进一步解释的UTF-8字符串
  3. 你现在必须做的是:

    1. 读取没有转码的“UTF-8”。
    2. 将其转换为Latin-1。现在你应该拥有原始的UTF-8。
    3. 现在将其放入“UTF-8”列,无需进一步转换。

答案 5 :(得分:1)

我最近完成了一个自动执行转换过程的shell脚本。它还可以配置为您要替换或删除的任何文本编写自定义过滤器。例如:剥离HTML字符等。表白名单和黑名单也是可能的。您可以在sourceforge下载它:https://sourceforge.net/projects/mysqltr/

答案 6 :(得分:0)

试试这个:

1)转储您的数据库

mysqldump --default-character-set=latin1 -u username -p databasename < dump.sql

2)在文本编辑器中打开dump.sql并用“SET NAMES utf8”替换“SET NAMES latin1”的所有出现

3)创建一个新数据库并恢复转储文件

cat dump.sql | mysql -u root -p newdbname