2013-12-09 4 views
5

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

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

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

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

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

+0

Я своего рода, стоящих перед такая же ситуация. Что вы в итоге сделали? – Hari

+0

@Hari Извините за поздний ответ. Я сделал это в следующем блоге: http://blog.xdite.net/posts/2013/12/19/mysql-with-utf8mb4. К сожалению, это написано на китайском языке, вы бы попробовали перевести Google, чтобы узнать, помогает ли это? – larryzhao

+0

http://blog.arkency.com/2015/05/how-to-store-emoji-in-a-rails-app-with-a-mysql-database/ – mahemoff

ответ

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 и смайликов, вам нужно будет добавить патч, как следующий (на основе решения в рельсам 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

Я сделал запрос таблицы alter выше. смайлы все еще заканчиваются как куча вопросительных знаков вроде этого «????» .. Есть идеи? – Hari

+0

получил это .. проблема с подключением базы данных моего приложения .. – Hari

+0

Что-нибудь, что я должен добавить к ответу? – schmierkov

Смежные вопросы