MySQL将latin1数据转换为UTF8

Kib*_*bee 8 mysql sql collation load-data-infile

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

[附加信息]

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

此表的Create Table(缩写)是.

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

lui*_*son 11

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

$ mysqldump –default-character-set=latin1 –databases wordpress > m.sql
Run Code Online (Sandbox Code Playgroud)

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

$ replace "CHARSET=latin1" "CHARSET=utf8" \
    "SET NAMES latin1" "SET NAMES utf8" < m.sql > m2.sql
Run Code Online (Sandbox Code Playgroud)

就我而言,这个链接非常有帮助.这里用西班牙文评论.


new*_*ver 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;
Run Code Online (Sandbox Code Playgroud)

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


Dig*_*oss 1

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

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

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

你现在必须做的是:

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