MySQL + Emoji ?

3 min read

В одном из наших проектов, который тесно связан с генерацией контента пользователями, появилась потребность в поддержке эмодзи. Обычно для записи содержимого сайта хватает и трехбайтной кодировки utf8, но для хранения Emoji потребуется четырехбайтная utf8mb4 (UTF-8 Multibyte 4), которая доступна в MySQL 5.5.3+ и более новых версиях.

Задача настройки возможности использования Emoji решается в два шага.

Немного о кодировках и представлениях

Кодировка (character set) — это способ описания набора символов. Например, UTF-8, ASCII, KOI8-R, CP1251. Представление (collation) — способ описания порядка букв в кодировках, который используется для сортировок. Рассмотрим основные отличия представлений.

В utf8_bin всё регистрозависимо. Символ 'A' не равен символу 'a' при поиске, а сортировка происходит в порядке следования в таблице символов для данной кодировки.

Представления, названия которых оканчиваются на _ci (case-insensitive), не увидят разницы между 'aAA' и 'aaa' при поиске и различаются только способами сортировки. 

utf8_general_ci работает быстрее, потому что при сортировке не учитываются особенности в порядке букв в некоторых языках. Например, ÀÁÅåāă = A или ü = U.

uft8_unicode_ci — чуть медленнее, но сортировки будут правильные во всех языках. Например, ß (эсцет немецкий) будет располагаться рядом с ss.

Настройка кодировки таблицы

Первым делом нужно сменить кодировку полей или целой таблицы в базе данных, где могут храниться эмодзи.

Например, в таблице Comments зададим полю text с типом text кодировку utf8mb4 и представление utf8mb4_general_ci.

ALTER TABLE `Comments` MODIFY `text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Настройка кодировки подключения

Данные в таблице теперь хранятся в правильной кодировке, поэтому осталось настроить подключение к базе данных.

Перед выполнением запросов в базу данных задайте кодировку, в которой собираетесь отправлять данные.

mysql_query('SET NAMES utf8mb4');

При наличии конфигурационного файла можно в нем изменить значение charset с utf8 на utf8mb4.

array( 'type' => 'MySQL', 'connection' => array( 'hostname' => '127.0.0.1', 'database' => 'dbname', 'username' => 'localuser', 'password' => '', ), 'charset' => 'utf8mb4', )

Результат

Теперь вы можете использовать эмодзи в своих проектах. ?

К сожалению, эмодзи отображаются ещё не на всех устройствах и могут выглядеть по-разному.

Face Throwing a Kiss

Существуют решения, позволяющие заменять символы Emoji на соответствующие изображения там, где они не доступны. Мы используем https://github.com/neSpecc/emoji-parser. Так, смайлы увидят пользователи даже старых устройств.