2013-12-09 12 views
5

Tôi có dự án Rails 3.2 sử dụng Mysql 5.5.34, với mã hóa utf8. Bây giờ tôi thấy rằng với mã hóa utf8 Mysql không thể lưu các ký tự unicode đại diện cho biểu tượng cảm xúc.Cách chuyển đổi mã hóa Mysql utf8 sang utf8mb4 trong dự án Rails

Vì vậy, tôi có thể chuyển đổi toàn bộ cơ sở dữ liệu để sử dụng mã hóa utf8mb4 mà tôi tìm thấy trên web có thể chứa 4 byte unicode bao gồm biểu tượng cảm xúc không?

Có phải tất cả thông tin tôi có trong cơ sở dữ liệu được bao gồm bởi mã hóa utf8mb4 không? Tôi sẽ phải đối mặt với dữ liệu bị mất nếu tôi làm điều đó?

Có cách nào Rails cung cấp để làm điều đó không?

Cảm ơn rất nhiều vì đã trợ giúp.

+0

Tôi kinda phải đối mặt với tình huống tương tự .. Bạn đã làm gì? – Hari

+0

@Hari Xin lỗi vì câu trả lời muộn. Tôi đã thực hiện theo dõi blog này: http://blog.xdite.net/posts/2013/12/19/mysql-with-utf8mb4. Thật không may, nó được viết bằng tiếng Hoa, bạn có thử Google dịch để xem nó có giúp ích không? – larryzhao

+0

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

Trả lời

0

Thực ra bạn chỉ cần di chuyển cột bạn muốn mã hóa bằng utf8mb4.

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

Nếu bạn định tự di chuyển dữ liệu thì có thể không thực hiện được, vì utf8 phổ biến bao gồm 3 byte và utf8mb4 trong số 4 byte. Vì vậy, bạn có thể đã có dữ liệu bị hỏng trong db của mình.

Ngoài ra, Rails 3.2 có sự cố mã hóa trong mã hóa JSON của ActiveSupports. Trong trường hợp bạn có kế hoạch để làm việc với json và biểu tượng cảm xúc, bạn sẽ cần phải thêm một bản vá như sau (dựa trên các giải pháp trong đường ray 4 https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/json/encoding.rb) hoặc chỉ đơn giản là nâng cấp lên đường ray 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

Tôi đã thực hiện truy vấn bảng thay đổi ở trên .. smilies vẫn kết thúc như một loạt các dấu hỏi như thế này "????" .. Bất kỳ ý tưởng? – Hari

+0

đã nhận được sự cố .. với sự cố kết nối cơ sở dữ liệu của ứng dụng của tôi .. – Hari

+0

Mọi thứ tôi nên thêm vào câu trả lời? – schmierkov

Các vấn đề liên quan