Символ эмодзи (????) не работает с utf8mb4_bin в MySQL версии 5.6

Я пытаюсь сохранить символ эмодзи в запись базы данных, но каждый раз он не сохраняется должным образом. Я сослался на это Как сохранить символ Emoji в моей базе данных SQL но по-прежнему не работает.
В соответствии с решением вышеуказанного вопроса я попытался изменить набор символов с utf8 на utf8mb4 и сопоставление с utf8mb4_bin.

Я пробовал все, например, сброс настроек по умолчанию, а затем их изменение в таблице базы данных. Я пробовал utf8mb4_unicode_ci, utf8_unicode_ci и utf8mb4_bin, но это не работает.

Я использую версию MySQL 5.6. И я меняю сопоставление с запросом ниже

alter table `users` convert to character set utf8mb4 collate utf8mb4_bin;

Приведенный выше код работает нормально, он меняет тип UTF в базе данных. Но смайлики не сохраняются должным образом, они сохраняются как вопросительные знаки (????)

Ниже приведен пример структуры таблицы моей базы данных:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'System generated id used for uniqueness',
  `introduction` longtext COLLATE utf8mb4_bin,
  `other_details` longtext COLLATE utf8mb4_bin,    
   PRIMARY KEY (`id`),
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=41213 ;


Чтобы сохранить эмодзи с помощью приведенного ниже PHP-кода:

$dom = new DOMDocument('1.0', 'UTF-8');
$strWithEmoji = "????";
$fullContent = '<meta http-equiv="content-type" content="text/html; charset=utf-8">'
               + $strWithEmoji;
$this->save($fullContent); // Function for saving into database


Я не знаю точно, сколько байтов хранится, но я пытаюсь сохранить только этот символ эмодзи «????», и он сохраняет его как 4 вопросительных знака (????).

Я перепробовал все решения по приведенным ниже ссылкам, но у меня это не сработало:
Как сохранить символ эмодзи в моей базе данных SQL
UTF-8 полностью
Окончательная схема кодирования эмодзи


person KRY    schedule 09.10.2017    source источник
comment
@Liam Я перепробовал все решения, которые уже задавали, но они не работают   -  person KRY    schedule 09.10.2017
comment
Вы почти ничего не добавили к своему первоначальному вопросу 2 дня назад. Пожалуйста, не задавайте один и тот же вопрос несколько раз. Не работает - не вопрос.   -  person Liam    schedule 09.10.2017
comment
@Лиам Вопрос удален   -  person KRY    schedule 09.10.2017
comment
Удаление дубликата здесь не поможет. На самом деле это делает его еще хуже... Была причина, по которой этот вопрос был помечен (модератором) как дубликат других вопросов. Кстати, люди, которые могут проголосовать за закрытие этого вопроса, могут видеть вопрос, даже если вы его удалили.   -  person Liam    schedule 09.10.2017
comment
@Liam Я указал все, что не было реализовано в предыдущем вопросе, и это мне не помогло. Это еще один случай, который я пытаюсь объяснить, тогда, пожалуйста, укажите, как это дубликат.   -  person KRY    schedule 09.10.2017
comment
Укажите точное количество байтов, которые пытались сохранить, и точное количество фактически сохраненных байтов. Также укажите фактическое SHOW CREATE TABLE для таблицы в вопросе. Кроме того, удалите все фреймворки/сторонние библиотеки из своего вопроса и предоставьте только код php+pdo/mysqli, который демонстрирует проблему.   -  person zerkms    schedule 09.10.2017
comment
@zerkms Обновил вопрос, я не делаю точные байты, я пытаюсь сохранить только один символ смайлика, который я упомянул в заголовке вопроса. Спасибо.   -  person KRY    schedule 09.10.2017
comment
Также удалите laravel или все, что у вас есть, и запускайте только php+pdo/mysqli. Так вы изолируете проблему. Затем убедитесь, что ваш файл, состоящий только из php+pdo, находится в кодировке utf8, и ваше соединение с pdo также имеет кодировку utf8.   -  person zerkms    schedule 09.10.2017
comment
@zerkms Я не думаю, что проблема в PHP-коде, потому что код отлично работает на локальном хосте, но проблема возникает только для работающих серверов.   -  person KRY    schedule 09.10.2017
comment
@KRY какую помощь вы ищете, если не хотите самостоятельно изолировать проблему? Я не думаю --- хорошо. Что вы предлагаете тогда?   -  person zerkms    schedule 09.10.2017
comment
@zerkms Код работает на моих локальных машинах, но не работает на живых серверах, поэтому очевидно, что это проблема MySQL, только я не понимаю, какая проблема с MySQL, и я уже обновил рассматриваемый код PHP.   -  person KRY    schedule 09.10.2017
comment
@KRY так ясно, что это проблема MySQL --- хорошо, если вам это ясно - вы, вероятно, должны знать ответ. В противном случае я не уверен, на чем основано это утверждение. Если вы не хотите должным образом изолировать проблему - я не уверен, что готов играть в угадайку. Тогда удачи :-) и я уже обновил рассматриваемый код PHP. --- вы не. Изоляция подразумевает, что у вас нет никаких фреймворков или других сторонних зависимостей, только php+pdo (которые я мог бы запустить сам на своей локальной машине как есть), ничего больше.   -  person zerkms    schedule 09.10.2017
comment
@zerkms Почему бы вам не попробовать другие вопросы?   -  person KRY    schedule 09.10.2017
comment
@KRY хорошо, я хотел помочь вам изолировать проблему, и когда она изолирована, если она все еще сохраняется - я хотел воспроизвести ее локально, чтобы помочь вам определить вашу проблему. Но ты решил, что тебе не нужна моя помощь. Ну что, за 8 часов у тебя что-то продвинулось? Вы все еще считаете выбранную стратегию эффективной?   -  person zerkms    schedule 09.10.2017


Ответы (1)


В подключении необходимо указать utf8mb4 для MySQL. Что находится под одеялом в DOMDocument?

???? — это шестнадцатеричный код F09F9880, который должен работать в столбце CHARACTER SET utf8mb4 с любой сортировкой utf8mb4_*.

А вот еще одна ссылка: Проблема с символы UTF-8; то, что я вижу, не то, что я сохранил

Если ничего не помогает, выполните SET NAMES utf8mb4 из PHP после установления соединения.

person Rick James    schedule 09.10.2017