如何将MySQL数据库从Latin-1迁移到UTF-8?

如何将MySQL数据库从Latin-1迁移到UTF-8?,mysql,database,encoding,utf-8,iso-8859-1,Mysql,Database,Encoding,Utf 8,Iso 8859 1,我有一个MySQL数据库(myDB;~2GB大小),有4个表(tab1,tab2,tab3,tab4)。目前,存储在表中的数据是使用字符集ISO-8859-1(即Latin-1)添加的 我想将所有表中的数据转换为UTF-8,并使用UTF-8作为表/数据库/列的默认字符集 我发现了一个有趣的方法: mysqldump myDB | sed -i 's/CHARSET=latin1/CHARSET=utf8/g' | iconv -f latin1 -t utf8 | mysql myDB2 我还

我有一个MySQL数据库(
myDB
;~2GB大小),有4个表(
tab1
tab2
tab3
tab4
)。目前,存储在表中的数据是使用字符集
ISO-8859-1
(即
Latin-1
)添加的

我想将所有表中的数据转换为
UTF-8
,并使用
UTF-8
作为表/数据库/列的默认字符集

我发现了一个有趣的方法:

mysqldump myDB | sed -i 's/CHARSET=latin1/CHARSET=utf8/g' | iconv -f latin1 -t utf8 | mysql myDB2
我还没试过,但有什么需要注意的吗

有没有一种方法可以直接在MySQL shell中执行此操作?

[编辑:]

显示创建表消息的结果运行后
将ALTER TABLE消息转换为字符集utf8mb4

CREATE TABLE `messages` (
  `number` int(11) NOT NULL AUTO_INCREMENT,
  `status` enum('0','1','2') NOT NULL DEFAULT '1',
  `user` varchar(30) NOT NULL DEFAULT '',
  `comment` varchar(250) NOT NULL DEFAULT '',
  `text` mediumtext NOT NULL,
  `date` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`number`),
  KEY `index_user_status_date` (`user`,`status`,`date`)
) ENGINE=InnoDB AUTO_INCREMENT=3285217 DEFAULT CHARSET=utf8mb4

可以转换这些表。但是,您还需要转换应用程序

ALTER TABLE tab1 CONVERT TO utf8mb4;
etc.
要进行检查,请执行
显示创建表tab1
;它应该显示
字符集utf8mb4

注意:有三件事正在发生:

  • 转换任何
    VARCHAR
    TEXT
    列中的数据编码
  • 更改此类列的
    字符集
  • 更改表的
    默认字符集
    ——如果在不指定字符集的情况下添加任何新列,这将起作用
应用程序

当您从客户端连接到MySQL时,您需要以特定于应用程序的方式或通过
设置名称
,告诉它客户端中字节的编码。这不必与列声明相同;如有必要,转换将在插入和选择过程中进行


我建议您备份和/或测试其中一个表的副本。请务必完成所有步骤--插入、选择、显示等。

我运行了
ALTER tab1转换为字符集utf8mb4
您说过
转换任何VARCHAR和TEXT列中的数据编码。
在该步骤中进行。这也是我发现的。但实际上,存储在我的表中的数据并没有被转换——它仍然是
Latin-1
——只有一些列的默认值和数据类型发生了更改(我在转储上运行了
diff dump\u convert.sql dump\u before\u cobert.sql
)。如何将当前存储在
latin-1
中的数据转换为
utf-8mb4
?请显示当前
show CREATE TABLE
(至少针对该列)并
选择十六进制(列)
。如果没有这两个方面,很难说专栏中到底有什么内容,以及这是否合适。