【问题标题】:How to convert Mysql encoding utf8 to utf8mb4 in Rails projectRails项目中如何将Mysql编码utf8转为utf8mb4
【发布时间】:2013-12-09 08:01:32
【问题描述】:

我有一个使用 Mysql 5.5.34 的 Rails 3.2 项目,采用 utf8 编码。现在我发现使用utf8 编码的Mysql 无法保存代表emoji 的unicode 字符。

那么我可以将整个数据库转换为使用我在网上找到的可以容纳 4 字节 unicode 包括表情符号的utf8mb4 编码吗?

utf8mb4 编码是否涵盖了我在数据库中的所有信息?如果我这样做,我会面临数据丢失吗?

Rails 提供了什么方法来做到这一点?

非常感谢您的帮助。

【问题讨论】:

标签: mysql ruby-on-rails ruby-on-rails-3 encoding


【解决方案1】:

其实你只需要迁移你想用utf8mb4编码的列。

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

如果您计划自行迁移数据,则可能无法迁移,因为常见的 utf8 由 3 个字节字符组成,而 utf8mb4 由 4 个字节组成。因此,您的数据库中可能已经有损坏的数据。

此外,Rails 3.2 在 ActiveSupports JSON 编码中存在编码问题。如果您计划使用 json 和 emojis,则需要添加如下补丁(基于 rails 4 https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/json/encoding.rb 中的解决方案),或者只需升级到 rails 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

【讨论】:

  • 我在上面进行了 alter table 查询.. 笑脸仍然是一堆像这样的问号“????” ..有什么想法吗?
  • 我应该在答案中添加什么?
  • @Hari 你是怎么解决数据库连接问题的?
猜你喜欢
  • 2022-06-22
  • 2013-08-18
  • 2016-11-18
  • 2016-02-16
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2023-03-21
相关资源
最近更新 更多