8

我使用 LOAD DATA INFILE 将一些数据导入 MySQL 数据库。表本身和列都使用UTF8字符集,但是数据库的默认字符集是latin 1。因为数据库的默认字符类型是latin1,而且我使用LOAD DATA INFILE没有指定字符集,它解释文件为 latin1,即使文件中的数据是 UTF8。现在我的 UTF8 列中有一堆编码错误的数据。我找到了这篇文章这似乎解决了类似的问题,即“UTF8 插入 cp1251”,但我的问题是“Latin1 插入 UTF8”。我尝试在那里编辑查询以将 latin1 数据转换为 UTF8,但无法正常工作。数据要么是一样的,要么比以前更加混乱。例如,Québec 一词显示为 Québec。

[附加信息]

When Selecting the data wrapped in HEX(), Québec has the value 5175C383C2A9626563.

该表的创建表(简称)是。

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

7 回答 7

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

就我而言,这个链接很有帮助。在这里用西班牙语评论。

于 2009-12-21T12:42:44.937 回答
7

尽管对于 OP 来说它几乎仍然不实际,但我碰巧在 MySQL 文档中找到了ALTER TABLE的解决方案。我把它贴在这里仅供参考:

警告

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

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

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

于 2012-01-17T16:52:43.980 回答
2

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

于 2009-12-27T04:16:36.287 回答
2

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

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

于 2009-09-17T19:46:47.850 回答
1

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

于 2013-03-20T21:36:10.257 回答
1

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

如果真的发生了这样的事情:

  1. UTF-8 字符串被解释为 Latin-1 并转码为 UTF-8,将它们弄乱。
  2. 您现在或可能正在读取 UTF-8 字符串,无需进一步解释

你现在必须做的是:

  1. 无需转码即可读取“UTF-8”。
  2. 将其转换为 Latin-1。现在您实际上应该拥有原始的 UTF-8。
  3. 现在将其放入您的“UTF-8”列中,无需进一步转换。
于 2009-09-17T19:35:42.543 回答
0

尝试这个:

1)转储你的数据库

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

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

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

cat dump.sql | mysql -u root -p newdbname
于 2012-05-16T15:36:10.783 回答