У меня есть проект Rails 3.2 с использованием Mysql 5.5.34
с кодировкой utf8. Теперь я обнаружил, что с utf8
кодировкой Mysql не удалось сохранить символы Unicode, которые представляют emoji.
Итак, для меня лучше конвертировать всю базу данных, чтобы использовать кодировку utf8mb4
, которую я нашел в Интернете, которая может содержать 4 байта unicode, включая emoji?
Является ли вся информация, содержащаяся в базе данных, охватываемой кодировкой utf8mb4
? Будет ли я сталкиваться с потерями данных, если я это сделаю?
Есть ли способ, который Rails предоставляет для этого?
Большое спасибо за помощь.
На самом деле вам просто нужно перенести столбец, который вы хотите кодировать с помощью utf8mb4.
execute("ALTER TABLE yourtablename MODIFY yourcolumnname TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;")
Если вы планируете перенести данные сами по себе, это может быть невозможно, так как общий utf8 состоит из 3 байт-байт и utf8mb4 из 4 байтов. Таким образом, у вас могут быть поврежденные данные в вашем db.
Кроме того, Rails 3.2 имеет проблему с кодировкой в кодировке JSON ActiveSupports. Если вы планируете работать с json и emojis, вам нужно будет добавить патч, как показано ниже (на основе решения в rails 4 https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/json/encoding.rb) или просто просто перейдите на рельсы 4.
module ActiveSupport
module JSON
module Encoding
class << self
def escape(string)
if string.respond_to?(:force_encoding)
string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY)
end
json = string.gsub(escape_regex) { |s| ESCAPED_CHARS[s] }
json = %("#{json}")
json.force_encoding(::Encoding::UTF_8) if json.respond_to?(:force_encoding)
json
end
end
end
end
end