zaLinux.ru

PHP не отображает эмодзи из базы данных MySQL / MariaDB (РЕШЕНО)


При извлечении строк из базы данных 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 которых хранит максимум три байта на кодовую точку, то четырехбайтовые символы (эмодзи и некоторые китайские иероглифы) в нём, скорее всего, безвозвратно потеряны.


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *