当我试图对数据库进行完整转储时,如下所示:
mysql --default-character-set=utf8 -uUSER -p database -r output.sql
它创建了一个UTF-8文件,但所有国际数据(中文,西班牙语,俄语)都损坏了,如下所示(它是转储的俄语部分):
(1,'Ð<9e> наÑ<81>')
然而,当我试图转储一个表,它工作得很好:mysql --default-character-set=utf8 -uUSER -p database table_name -r output.sql
我不太明白是什么导致了这个问题,因为所有可能的变量都被设置为UTF-8:
show variables like "collation_database";
+--------------------+-----------------+
| Variable_name | Value |
+--------------------+-----------------+
| collation_database | utf8_general_ci |
+--------------------+-----------------+
show variables like "character_set_database";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
所有的表也有相同的字符集/排序规则。在my.cnf
中有以下设置[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
最后,locale也设置为utf-8。那么问题是什么呢?我很确定这是一个愚蠢的问题,但我没有办法了。我将非常感谢您的帮助。
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
然后在shell中复制并编辑
shell> cp dump.sql dump-fixed.sql
shell> vi or vim dump-fixed.sql
:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
然后保存文件
我对此非常挣扎,并尝试了我发现的许多在线解决方案,例如--default-character-set=utf8
或iconv
或vim setfileencoding=utf8
,但这些都不起作用!更令人沮丧的是,因为我可以在数据库本身中选择正确格式化的数据,并且我可以选择全部采用UTF-8格式的编码变量。无论如何!
TLDR解决方案:
- 正常创建转储,除了和
-default-character-set=latin1 --skip-set-charset
。 - 手动查找/替换"latin1"与
"utf8"
(或"utf8mb3"
,这只是一个别名,所以,使用其中之一)。
完整代码解决方案:
mysqldump
-u username -pPASSWORD
-h mysql.example.com
--default-character-set=latin1
--skip-set-charset
--no-tablespaces
-N
--routines
--skip-triggers
DATABASENAME > OUTPUTFILE.sql
或者,在一行中:
mysqldump -u username -pPASSWORD -h mysql.example.com --default-character-set=latin1 --skip-set-charset --no-tablespaces -N --routines --skip-triggers DATABASENAME > OUTPUTFILE.sql
基本代码说明:
-
--default-character-set=latin1
和--skip-set-charset
:这阻止MySQL尝试做任何实际的数据重新转换,这可能会破坏东西。 -
--no-tablespaces
:这解决了一个由MySQL错误引起的ACCESS-Denied Error。 -
--skip-triggers
:跳过触发器,但如果你使用它们,你可能需要这个。
备份是如何工作的?测试:
要恢复转储,只需在MySQL提示符中执行:
mysql> create database ExampleDB;
mysql> use ExampleDB;
mysql> source ExampleDB-backup.sql;