2009-09-17 186 views
8

我使用LOAD DATA INFILE将一些数据导入到MySQL数据库中。表本身和列使用的是UTF8字符集,但数据库的默认字符集是拉丁文的1.因为数据库的默认字符类型是latin1,并且我使用了LOAD DATA INFILE而没有指定字符集,所以它解释了该文件为latin1,即使该文件中的数据是UTF8。现在我在我的UTF8列中有一堆严重编码的数据。我发现this article似乎解决了类似的问题,即“在cp1251中插入UTF8”,但是我的问题是“Latin1以UTF8插入”。我试着编辑那里的查询来将latin1数据转换为UTF8,但无法让它工作。无论是数据都是相同的,或者比以前更加严重。仅举一个例子,魁北克这个词就表现为Québec。MySQL将latin1数据转换为UTF8

[附加信息]

当选择包裹在HEX数据(),QUA©BEC具有值5175C383C2A9626563。

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

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

请发布CREATE TABLE语句,以及一些破损的行,但是用十六进制()包装破碎的列,如下所示:'SELECT HEX(name )从城市限制5''。有了这些信息,我可以帮助你根据那篇文章找出解决问题的正确方法。 (顺便说一句:我喜欢那篇文章!它已经拯救了我的屁股了好几次。) – longneck 2009-09-17 19:42:28

回答

1

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

如果真正发生的事情是这样的:

  1. UTF-8字符串被解释为拉丁-1和代码转换为UTF-8,压延他们。
  2. 你现在的样子,或可能是,读取UTF-8字符串,没有进一步的解释

你现在必须做的是:

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

LOAD DATA INFILE允许你设置的编码文件被认为是在:

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

+0

是的,我希望我会事先意识到这一点,但现在数据已经被破坏了。我想知道我是否可以在不重新导入的情况下修复它。 – Kibbee 2009-09-17 20:34:10

+0

是的!这是选项:[CHARACTER SET charset_name] – 2012-09-25 14:38:01

11

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

$ 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

+0

我看过MySQL转储的地方,这个替换命令是不够的,因为一些列被明确设置为latin1。我没有'替换“latin1”“utf8mb4” dump.utf8.sql',使该表中的所有内容都使用UTF-8。但是请注意,“latin1”在转储(字段内容)中没有出现,并且为了确保在导入之前检查了diff。 – basic6 2014-07-10 12:16:09

7

尽管对于OP来说实际上还不是很实际,但我碰巧在ALTER TABLE的MySQL文档中找到了一个解决方案。我张贴在这里只是以供将来参考:

警告

转换TO操作列的值转换的字符集之间。如果你在一个字符集中有一列(比如latin1),但这个存储的值实际上使用了其他不兼容的字符集(如utf8),那么这不是你想要的。在这种情况下,你必须做到以下几点为每个这样的列:

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

这部作品的原因是没有转换,当您转换或从BLOB列。

+0

这对我有效。谢谢! – riverstorm 2013-12-19 10:50:02

+0

混合内容不起作用: 代码:1366 SQL状态:HY000 ---错误的字符串值:'\ xE4chste ...'在第1行的列'kommentar'中 – 2014-07-31 06:31:00

0

试试这个:

1)转储你的数据库

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

2)在文本编辑器打开dump.sql和取代的 “集名处理latin1” 所有出现的 “集名称UTF8”

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

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

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

相关问题