2013-12-09 13 views
5

Mam projekt Rails 3.2 przy użyciu Mysql 5.5.34, z kodowaniem utf8. Teraz stwierdziłem, że z utf8 kodowanie Mysql nie może zapisać znaków unicode, które reprezentują emoji.Jak przekonwertować kodowanie Mysql utf8 do utf8mb4 w projekcie Railsy

Czy mogę przekonwertować całą bazę danych na kodowanie utf8mb4 znalezione w Internecie, które może zawierać 4-bajtowy kod Unicode, w tym emoji?

Czy wszystkie informacje, które mam w bazie danych objęte kodowaniem utf8mb4? Czy będę miał do czynienia z utratą danych, jeśli to zrobię?

Czy istnieje sposób, że Rails zapewnia to zrobić?

Wielkie dzięki za pomoc.

+0

jestem trochę stojących przed ta sama sytuacja ... Co robiłeś w końcu? – Hari

+0

@Hari Przepraszamy za spóźnioną odpowiedź. Robiłem to po tym blogu: http://blog.xdite.net/posts/2013/12/19/mysql-with-utf8mb4. Niestety jest napisane po chińsku, czy próbowałbyś przetłumaczyć Google, aby sprawdzić, czy to pomaga? – larryzhao

+0

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

Odpowiedz

0

Właściwie wystarczy przeprowadzić migrację kolumny, którą chcesz zakodować za pomocą utf8mb4.

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

Jeśli planują migrację samych danych może nie być możliwe, ponieważ wspólne utf8 składa się z 3-bajtowych znaków i utf8mb4 z 4 bajtów. Więc możesz już mieć uszkodzone dane w twojej db.

Ponadto Rails 3.2 ma problem z kodowaniem w ramach kodowania JSON ActiveSupports. W przypadku, masz zamiar pracować z JSON i emotikony, trzeba będzie dodać łatkę jak następuje (w oparciu o rozwiązania w szynach 4 https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/json/encoding.rb) lub po prostu przejść na szynach 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

Zrobiłem zapytanie o tabelę alter powyżej .. uśmieszki wciąż kończą się w gronie takich znaków zapytania jak "????" .. Dowolny pomysł? – Hari

+0

Mam problem. Problem dotyczy połączenia z bazą danych mojej aplikacji .. – Hari

+0

Cokolwiek powinienem dodać do odpowiedzi? – schmierkov