Как конвертировать Mysql кодировку utf8 в utf8mb4 в проекте Rails

5

У меня есть проект Rails 3.2 с использованием Mysql 5.5.34 с кодировкой utf8. Теперь я обнаружил, что с utf8 кодировкой Mysql не удалось сохранить символы Unicode, которые представляют emoji.

Итак, для меня лучше конвертировать всю базу данных, чтобы использовать кодировку utf8mb4, которую я нашел в Интернете, которая может содержать 4 байта unicode, включая emoji?

Является ли вся информация, содержащаяся в базе данных, охватываемой кодировкой utf8mb4? Будет ли я сталкиваться с потерями данных, если я это сделаю?

Есть ли способ, который Rails предоставляет для этого?

Большое спасибо за помощь.

  • 0
    Я как бы сталкиваюсь с той же ситуацией .. Что ты в итоге делал?
  • 0
    @Hari Извините за поздний ответ. Я сделал это после этого блога: blog.xdite.net/posts/2013/12/19/mysql-with-utf8mb4 . К сожалению, он написан на китайском языке, попробуйте Google Translate, чтобы увидеть, помогает ли это?
Показать ещё 1 комментарий
Теги:
encoding
ruby-on-rails-3

1 ответ

0

На самом деле вам просто нужно перенести столбец, который вы хотите кодировать с помощью 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
  • 0
    Я сделал запрос на изменение таблицы выше ... смайлики все еще заканчиваются как куча вопросительных знаков, таких как "????" .. Любая идея?
  • 0
    понял .. проблема с подключением базы данных моего приложения ..
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню