Emoji не хранится должным образом в MySQL 5.6 с сопоставлением utf8mb4

Я пытаюсь сохранить смайлики в базе данных на своем сервере. Я использую экземпляр AWS EC2 в качестве сервера, сведения о моем сервере перечислены ниже:

ОС: убунту0.14.04.1

Версия MySQL: 5.6.19-0ubuntu0.14.04.1 - (Ubuntu)

Версия клиента базы данных: libmysql — mysqlnd 5.0.11-dev — 20120503

Я создал тест базы данных и таблицу смайликов на сервере со следующим SQL:

CREATE DATABASE IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `test`;

CREATE TABLE IF NOT EXISTS `emoji` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `text` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;

Когда я попытался выполнить следующую вставку, появляется предупреждение и данные не сохраняются должным образом:

INSERT INTO  `test`.`emoji` (`id` , `text`) VALUES (NULL ,  '???? ???? ???? ????');

Идентификатор вставленной строки: 3

Предупреждение: #1366 Неверное строковое значение: '\xF0\x9F\x91\x86 \xF0...' для столбца "текст" в строке 1

В текстовом столбце хранится следующее значение: ???? ???? ???? ????

Тот же сценарий работает для моей локальной базы данных, и значения сохраняются правильно. Почти все конфигурации аналогичны моей локальной, кроме ОС (Windows).


person Code Help    schedule 18.05.2015    source источник
comment
Пожалуйста, сделайте SHOW CREATE TABLE test.emoji\G -- я хочу посмотреть, не испортился ли он каким-то образом после того, как вы его создали.   -  person Rick James    schedule 18.05.2015
comment
В какой подсказке вы запустили INSERT, который не работает? (F09F9186 выглядит правильно.)   -  person Rick James    schedule 18.05.2015
comment
CREATE TABLE emoji ( id int(10) unsigned NOT NULL AUTO_INCREMENT, text varchar(255) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=4 CHARSET ПО УМОЛЧАНИЮ=utf8mb4   -  person Code Help    schedule 18.05.2015
comment
Укажите SELECT text, HEX(text) FROM emoji (для рассматриваемой строки). Происходит что-то странное.   -  person Rick James    schedule 18.05.2015
comment
Я использую drupal для своего приложения. Для тестирования функций эмодзи я использую интерфейс PhpMyAdmin, который также показывает предупреждающие сообщения. При выполнении из консоли также выдает предупреждение: Query OK, 1 row affected, 1 warning (0.00 sec)   -  person Code Help    schedule 18.05.2015
comment
1 warning -- снова запустите запрос, затем быстро выполните SHOW WARNINGS;   -  person Rick James    schedule 18.05.2015
comment
+-----------------------------------+---------------------------------------------------+ | text | HEX(текст) | +-----------------------------------+---------------------------------------------------+ | ???? ???? ???? ???? | 3F3F3F3F203F3F3F3F203F3F3F3F203F3F3F3F +-----------------------------------+--------------------------------------------------------------------+   -  person Code Help    schedule 18.05.2015
comment
phpmyadmin и/или drupal могут таинственным образом что-то менять. Какой из них дал вам ????? Какой из них дал вам # 1366?   -  person Rick James    schedule 18.05.2015
comment
Гррр... Единственный известный мне способ получить этот шестнадцатеричный код в таблице - это объявить столбец latin1, что явно не так.   -  person Rick James    schedule 18.05.2015
comment
Предупреждение | 1366 | Неверное строковое значение: '\xF0\x9F\x91\x86 \xF0...' для столбца "текст" в строке 1 |   -  person Code Help    schedule 18.05.2015
comment
Какая кодировка соединения? (И phpmyadmin, и друпал). Посмотрите в dsn или параметрах соединения. Вы подключаетесь как root?   -  person Rick James    schedule 18.05.2015
comment
Последнее предупреждение, опубликованное здесь, исходит из консоли mysql.   -  person Code Help    schedule 18.05.2015
comment
консоль mysql - вы имеете в виду инструмент командной строки mysql?   -  person Rick James    schedule 18.05.2015
comment
@РикДжеймс | Variable_name | Value | | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+   -  person Code Help    schedule 18.05.2015
comment
@RickJames Да, я использую инструмент командной строки mysql из SSH-соединения с сервером. Такое же поведение и на phpmyadmin.   -  person Code Help    schedule 18.05.2015
comment
это, вероятно, настройки подключения к базе данных, см.: stackoverflow.com/questions/35125933/   -  person mike_l    schedule 15.11.2016


Ответы (3)


Я смог воссоздать вашу проблему с помощью SqlWorkbench.

Ваш клиент, скорее всего, установил соединение с БД, набор символов которой не соответствует набору символов таблицы:

запустите этот оператор перед запуском оператора вставки, чтобы выровнять набор символов и сопоставление соединения:

SET NAMES utf8mb4 COLLATE utf8mb4_general_ci

Надеюсь, это поможет, наборы символов могут быть сложными.

person Bob Lukens    schedule 25.12.2016

Попытка сохранить смайлики в моей существующей таблице базы данных, используя следующий стек Node-Js 12.13.x, Mysql 5.6.

Наоборот:

  1. Либо следуйте этому решению
  2. Или измените тип данных столбца на BLOB, т.е.

ALTER TABLE table_name CHANGE column column BLOB NULL

Надеюсь, этот трюк сработает для вас!

person Haisum Usman    schedule 03.04.2020

Миграция с MSSQL на MySQL с использованием workbench всегда вызывает проблемы.

Workbench уже устанавливает utf8mb4 и все еще получает ошибку.

Затем я следую предложению @Haisum Usman:

  1. Установите столбец как Blob при создании SQL миграции.
  2. Перенести данные
  3. Изменить столбец на ДЛИННЫЙ ТЕКСТ!

Много времени вложено, чтобы заставить это работать.

person user2823085    schedule 17.09.2020