MySQL:将具有 utf8 排序规则和字符集但 latin1 数据的数据库迁移到新的完整 UTF-8 数据库

nma*_*mad 6 mysql

在我目前的情况下,我有 mysql 数据库,数据库和表上的排序规则和字符集设置为 utf8,但所有数据仍然是 latin1。这是由于服务器配置 (my.cnf) 有:

character-set-server = latin1
Run Code Online (Sandbox Code Playgroud)

以下是有关旧数据库服务器的更多信息:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

现在我们有了新的正确配置的完整 UTF-8 数据库实例,我需要转储数据。我一直在尝试不同的方式,但没有任何运气。现在原始数据库上的数据是乱码,我需要将其导出到完整的 UTF-8 数据库。

我试过这个:

mysqldump -h DB_HOST -u DB_USER -p DB_PASSWORD --opt --quote-names \
--skip-set-charset --default-character-set=latin1 DB_NAME > DB_NAME-dump.sql

mysql -h DB_HOST -u DB_USER -p DB_PASSWORD \
--default-character-set=utf8 DB_NAME < DB_NAME-dump.sql
Run Code Online (Sandbox Code Playgroud)

但这无济于事,因为 .sql 文件和新数据库中的数据是 UTF-8 乱码

nma*_*mad 6

在阅读了各种问题并尝试了不同的方法后,这就是我的解决方案:

转储必须像这样完成(确保将文件名作为 -r 参数传递):

mysqldump -h HOST -u USER -p --default-character-set=latin1 DATABASE -r utf8.dump
Run Code Online (Sandbox Code Playgroud)

然后我打开了 utf8.dump 文件并在顶部更改了一行。

/*!40101 SET NAMES latin1 */;
Run Code Online (Sandbox Code Playgroud)

/*!40101 SET NAMES utf8 */;
Run Code Online (Sandbox Code Playgroud)

然后我将它导入(确保使用 mysql 而不是 mysqldump 并获取文件,不要使用“<”从终端传递它):

mysql -u USER -p DB -h HOST

mysql> source utf8.dump
Run Code Online (Sandbox Code Playgroud)

在此之后,我所有的数据都被正确编码并存储为 UTF-8(例如 hét -> hét)