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 не знает данной кодировки. Коммит с добавление данной кодировки уже давно внесён в гем, но нового релиза до сих пор ещё не было.
Есть два способо решить данную проблему:
-
#####Обновить гем до бета версии(не желательно, кто знает какие косяки там могут быть)
-
#####Небольшое редактирование гема
Открываем файл 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.