Skip to content

Instantly share code, notes, and snippets.

@Nitrino
Last active December 18, 2015 10:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Nitrino/5766393 to your computer and use it in GitHub Desktop.
Save Nitrino/5766393 to your computer and use it in GitHub Desktop.
ios emoji in rails + mysql

Emoji in Rails + MySQL

UTF8 содержит три байта на символ, что не в полной мере отражает такие языки как японский. В ios используются смайлы emoji тоже пришедшие из японии и старая версия utf8 использующая 3 байта на символ их не поддерживает. Новая версия utf8 (utf8mb4) использует 4 байта на символ и в полной мере поддерживает все языки и спецсимволы. MySQL c версии 5.5.3 поддерживает utf8mb4

Для поддержки emoji нужно конвертировать нужную таблицу или всё базу в utf8mb4. Сделать это можно с помощью команд: Для базы: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; Для таблицы: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Тут нужно быть осторожным, так как меняется длинна полей. Например: При исользовании старого utf8 тип varchar вмещал 255 символов. 255*3=765 байт. Если используем utf8mb4 получаем: 765/4=191 символ. Подробней об этом можно почитать тут

После измения кодировки MySQL перестанет обрезать emoji символы, но так как в database.yml прописанно encoding: utf8, то вместо смайлов мы будем получать знаки вопросов "????". Меняем кодировку на utf8mb4, и тут мы столкнёмся с ошибкой, что гем mysql2 не знает данной кодировки. Коммит с добавление данной кодировки уже давно внесён в гем, но нового релиза до сих пор ещё не было.

Есть два способо решить данную проблему:

  1. #####Обновить гем до бета версии(не желательно, кто знает какие косяки там могут быть)

  2. #####Небольшое редактирование гема

Открываем файл client.rb, находится он примерно по такому пути(если используется rvm): .rvm/gems/ruby-1.9.2-p318/gems/mysql2-0.3.11/lib/mysql2/client.rb и дописываем нужные строчки:

CHARSET_MAP = {
  ................
  "ujis"     => Encoding::EucJP_ms,
  "utf8"     => Encoding::UTF_8,
  "utf8mb4"  => Encoding::UTF_8,
}
MYSQL_CHARSET_MAP = {
  1 => {:name => "big5",      :collation => "big5_chinese_ci"},
  ................
  255 => {:name => "utf8mb4",  :collation => "utf8mb4_general_ci"},
}

Перезагружаем nginx и радуемся поддержке emoji.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment