2013-12-09 16 views
5

Ich habe ein Projekt Rails 3.2 mit Mysql 5.5.34, mit utf8 Codierung. Jetzt habe ich gefunden, dass mit utf8 Codierung Mysql Unicode-Zeichen, die Emoji darstellen, nicht speichern kann.Wie Konvertieren Mysql Codierung UTF8 zu UTF8mb4 in Rails-Projekt

Also ist es in Ordnung für mich, die gesamte Datenbank zu konvertieren, um utf8mb4 Codierung zu verwenden, die ich im Web gefunden habe, die 4 Byte Unicode einschließlich Emoji halten könnte?

Sind alle Informationen in der Datenbank von utf8mb4 codiert? Werde ich Daten verlieren, wenn ich das tue?

Gibt es eine Möglichkeit, dass Rails dies zu tun?

Vielen Dank für Ihre Hilfe.

+0

ich irgendwie bin vor der gleiche Situation .. Was hast du am Ende gemacht? – Hari

+0

@Hari Sorry für die späte Antwort. Ich habe das nach diesem Blog getan: http://blog.xdite.net/posts/2013/12/19/mysql-with-utf8mb4. Leider ist es auf Chinesisch geschrieben. Würden Sie Google Translate ausprobieren, um zu sehen, ob es hilft? – larryzhao

+0

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

Antwort

0

Eigentlich müssen Sie nur die Spalte migrieren, die Sie mit utf8mb4 verschlüsseln möchten.

execute("ALTER TABLE yourtablename MODIFY yourcolumnname TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;") 

Wenn Sie planen, um die Daten zu migrieren, selbst könnte es nicht möglich sein, da die gemeinsame utf8 aus 3-Byte-Zeichen besteht und die utf8mb4 von 4 Byte. Sie haben also möglicherweise bereits beschädigte Daten in Ihrer Datenbank.

Darüber hinaus hat Rails 3.2 ein Codierungsproblem innerhalb der ActiveSupports JSON-Codierung. Falls Sie planen, mit json und Emojis zu arbeiten, müssen Sie einen Patch hinzufügen, wie die folgenden (bezogen auf die Lösung in Schienen 4 https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/json/encoding.rb) oder einfach auf Schienen Upgrade 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

Ich habe die alter Tabelle Abfrage oben .. die Smilies enden immer noch als ein Bündel von Fragezeichen wie dieses "????" .. Irgendeine Idee? – Hari

+0

habe es .. das Problem ist mit der Datenbankverbindung meiner app .. – Hari

+0

Alles, was ich zur Antwort hinzufügen sollte? – schmierkov

Verwandte Themen