我使用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;
答案 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允许您设置编码文件应该在:
答案 3 :(得分:2)
我为拉丁数据库写了http://code.google.com/p/mysqlutf8convertor/到UTF-8数据库。所有表格和字段都要更改UTF-8。
答案 4 :(得分:1)
将latin1转换为UTF8不是你想要做的,你需要相反的。
如果真的发生了这件事:
你现在必须做的是:
答案 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