При извлечении строк из базы данных MySQL (MariaDB) вы можете столкнуться с ситуацией, что весь текст отображается правильно, но вместо эмодзи выводятся знаки вопросов.
Наиболее вероятная проблема — неправильно используемая кодировка при выполнении запросов к СУБД MySQL (MariaDB). Исправить эту ситуацию можно двумя способами.
1. Выберите кодировку utf8mb4_unicode_ci при создании базы данных
Строго говоря, проблема с исчезновением эмодзи или заменой их на знаки вопроса не должна существовать вовсе.
Если эта проблема существует, то, скорее всего, ваша база данных имеет кодировку utf8_general_ci или какую-то другую устаревшую. В настоящее время для баз данных рекомендуется кодировка utf8mb4_unicode_ci. Подробности смотрите в статье «В чём разница между кодировками utf8_general_ci, utf8_unicode_ci, utf8mb4_general_ci, utf8mb4_unicode_ci. Какую кодировку выбрать для базы данных MySQL».
При выборе правильной кодировки базы данных, эмодзи должны отображаться.
Примечание: точнее utf8mb4_unicode_ci это не совсем кодировка, в терминах MySQL это называется COLLATION («сравнение») и включает в себя набор символов, а также правила сравнения и сортировки. То есть utf8mb4_unicode_ci это COLLATION, а utf8mb4 это набор символов, а UTF-8 это уже и есть кодировка переменной длины.
Кстати, при создании таблиц также нужно указывать CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci для таблицы в целом и COLLATE utf8mb4_unicode_ci для текстовых полей.
Именно с такой ситуацией я столкнулся на хостинге:
- базы данных на хостинге можно создавать только в веб-интерфейсе панели управления хостингом. При этом базы данных создаются с кодировкой utf8_general_ci. И исправить это никак нельзя, поскольку кроме имени базы данных и имени пользователя, веб-интерфейс не позволяет указать другие параметры
- тем не менее таблицы, которые я импортировал в базы данных, используют набор символов utf8mb4 — благодаря этому данные, в том числе четырехбайтовые символы эмодзи, остались неповреждёнными
- но при извлечении данных из таблиц скриптом PHP, вместо символов эмодзи показываются знаки вопросов
Поскольку я не могу исправить кодировку баз данных в этом случае, то имеется ещё одно решение.
2. Укажите набор символов utf8mb4 для соединения с MySQL (MariaDB) из PHP скрипта
Правильный набор символов вы можете указать с помощью SQL-запроса:
SET NAMES utf8mb4;
Этот оператор устанавливает три системные переменные сеанса: character_set_client, character_set_connection и character_set_results в заданный набор символов.
В PHP скрипте это можно сделать следующим образом:
<?php $mysqli = new mysqli('localhost', $db_user, $db_password, $db_name); if ($mysqli->connect_errno) { printf("Somehow failed : %s\n", $mysqli->connect_error); exit(); } $mysqli->query("SET NAMES utf8mb4");
Выбор правильного набора символов не исправил проблему — эмодзи отображаются неправильно
Возможно неприятная ситуация, когда данные в базах данных и таблицах повреждены и установкой правильного набора символов ситуацию не исправить.
Если текст с эмодзи был сохранён в таблицу с набором символов utf8mb3, то есть как UTF-8 которых хранит максимум три байта на кодовую точку, то четырехбайтовые символы (эмодзи и некоторые китайские иероглифы) в нём, скорее всего, безвозвратно потеряны.
Связанные статьи:
- Ошибка «ERROR 1366 (22007): Incorrect string value» в MySQL / MariaDB (РЕШЕНО) (66.5%)
- Ошибка «PHP Fatal error: Uncaught mysqli_sql_exception: No database selected» (РЕШЕНО) (56.9%)
- Как вывести список пользователей MySQL / MariaDB и их привилегии (с помощью клиента СУБД и PHP) (56.1%)
- Как в MySQL / MariaDB вывести список столбцов. Как в PHP проверить наличие столбца в таблице (50%)
- Как в PHP проверить, что результат SQL-запроса пуст или не пуст (36.7%)
- Как исправить «Windows is hibernated, refused to mount» (РЕШЕНО) (RANDOM - 0.8%)