我正在使用MySQL 5.5.29,utf8mb4字符集,有一个表用户包含一个字段nickname
,其值为十六进制F09F988EF09F988E
,可转换为表情符号。
现在打开MySQL控制台,然后执行:
set names utf8mb4;
select nickname, hex(nickname) from user;
nickname | hex(nickname)
---------+-----------------
| F09F988EF09F988E
然后执行:
mysqldump --default-character-set=utf8 -utest -ptest test_dev user > user.sql
检查user.sql
并找到昵称显示??
,其中十六进制字符串为3f
那么,mysqldump如何用UTF8导出正确的emojis字符串?
btw,数据库字符集环境配置如下: 显示'character_set _%'等变量:
'character_set_client', 'utf8mb4'
'character_set_connection', 'utf8mb4'
'character_set_database', 'utf8mb4'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8mb4'
'character_set_server', 'utf8mb4'
'character_set_system', 'utf8'
'character_sets_dir', '/data/mysql/share/charsets/'
答案 0 :(得分:18)
谢谢Danack!
通过指定utf8mb4
charset并将mysqldump版本升级到5.5.3 +,mysqldump& mysql适用于4字节表情符号。
[tomcat@localhost ~]$ mysqldump --default-character-set=utf8mb4 -utest -ptest test_dev user > user.sql
如果显示如下错误:
mysqldump: Character set 'utf8mb4' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file
检查您的mysqldump
版本(mysqldump --version
)
[tomcat@localhost ~]$ mysqldump --version
mysqldump Ver 10.11 Distrib 5.0.95, for redhat-linux-gnu (x86_64)
将mysqldump升级到5.5.33后,它可以正常工作。
[tomcat@localhost ~]$ mysqldump --version
mysqldump Ver 10.13 Distrib 5.5.33, for Linux (x86_64)
答案 1 :(得分:4)
确实,导出时需要使用mysqldump --default-character-set=utf8mb4
(注意--default-character-set
选项)。
但是导入仍然非常棘手。我尝试了许多不同的方法,但没有成功。
最后,我发现您需要创建一个importer.sql
文件,如下所示:
USE my_example_db_name;
# Select the right charset
SET NAMES 'utf8mb4';
# Import from SQL file
SOURCE /somewhere/dump.sql;
# Disconnect from SQL server
EXIT
然后,要导入,请运行:
mysql -u my_user my_example_db_name < /somewhere/importer.sql
答案 2 :(得分:0)
我用过:
# mysqldump -h localhost -u myUser -p --default-character-set=uft8 myDb > /var/backups/$(date +%Y%m%dT%H%M%S).myDb.bck.sql
,并出现相同的错误:
mysqldump: Character set 'uft8' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file
所以我检查了:
# grep utf /usr/share/mysql/charsets/Index.xml
<?xml version='1.0' encoding="utf-8"?>
<charset name="utf8">
<alias>utf-8</alias>
<collation name="utf8_general_ci" id="33">
<collation name="utf8_bin" id="83">
令人困惑。所以我变得固执并尝试过组合。这可行:
--default-character-set=UTF8
答案 3 :(得分:0)
也为此苦苦挣扎了一段时间。此线程中的其他解决方案仍然导致 dump.sql
仍然有多个错误的表情符号字符。
事实证明,使用 >
不是一种安全的导出方式(至少不是在我的机器上,Windows 10)。使用 -r dump.sql
而不是 > dump.sql
可以解决问题。
这个命令导出数据库的所有表:
mysqldump --default-character-set=utf8mb4 -h [host] -u [username] -p [database_name] --set-gtid-purged=OFF --port=3306 --protocol=tcp --skip-triggers -r dump.sql
然后为了导入,首先运行这个命令:
mysql -h [host_name] -u [username] -p [database_name] --binary-mode -o
然后,在 mysql 模式下,键入以下内容:
USE database_name;
SET NAMES 'utf8mb4';
SOURCE /dump.sql;
EXIT
希望这能帮助其他有同样问题的人!