使用utf8的mysqldump无法导出正确的表情符号字符串

时间:2013-11-26 12:16:25

标签: mysql utf-8 character-encoding emoji

我正在使用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/'

4 个答案:

答案 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

谢谢https://korobochkin.wordpress.com/2017/02/25/import-and-export-wordpress-database-with-utf8mb4-charset/

答案 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

希望这能帮助其他有同样问题的人!