mysqldump с utf8 не может экспортировать правильную строку смайлика

Я использую MySQL 5.5.29, кодировку utf8mb4, есть таблица user, содержащая поле nickname со значением hex 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 может экспортировать правильную строку смайлика?


btw, envionments кодировки базы данных настроены следующим образом: показать такие переменные, как '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/'

person user3036278    schedule 26.11.2013    source источник
comment
Что произойдет, если 1) вы измените набор символов по умолчанию на --default-character-set = utf8mb4 2) вы экспортируете напрямую в файл, например. выполнить mysqldump --default-character-set = utf8mb4 -utest -ptest test_dev user -r user.sql   -  person Danack    schedule 26.11.2013
comment
Кроме того, вы пробовали повторно импортировать данные? Возможно, ваш редактор просто отображает вопросительные знаки, поскольку в его шрифте нет правильных символов.   -  person Danack    schedule 26.11.2013


Ответы (3)


Спасибо, Данак!
Если указать кодировку utf8mb4 и обновить версию 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)
person user3036278    schedule 27.11.2013
comment
связанные: С этой даты инструмент экспорта в MySql Workbench жестко кодирует параметр набора символов по умолчанию как utf8 ... * вздох * .. - person Brad Kent; 05.02.2016

Это правда, что вам нужно использовать 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/

person Ryan    schedule 12.09.2018
comment
Работает как шарм! Спасибо брат! - person Egist Li; 07.07.2021
comment
@EgistLi Рад, что помог! - person Ryan; 09.07.2021

Некоторое время тоже боролся с этим. Другие решения в этом потоке по-прежнему приводили к тому, что 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

Надеюсь, это поможет другим, у которых была такая же проблема!

person TWinters    schedule 06.01.2021