【问题标题】:Save utf8mb4 characters in mysql without changing anything in the table or db在 mysql 中保存 utf8mb4 字符而不更改表或数据库中的任何内容
【发布时间】:2017-11-21 17:38:40
【问题描述】:

我有一个 utf8mb4 字符需要保存在 MySQL 的列中。所有解决方案都指向删除 4 字节字符或更改表的排序规则或字符集。

我还注意到 Rails(ActiveRecord) 安全转换了????到 \U0001F4A1 并将其存储在数据库中。我想知道 ActiveRecord 是如何做到的以及我该如何做到这一点

【问题讨论】:

    标签: mysql ruby-on-rails ruby utf8mb4


    【解决方案1】:

    简短回答: 你不能这样做。如果要在 mysql 中保存 4 字节字符,则需要使用 UTF8mb4

    更长的答案: 以一种 hacky 的方式,您可以通过序列化来保存这样的字符。假设您的模型是 Foo 并且您保存 4 字节字符的列是 bar,您将有类似的内容:

    class Foo < ActiveRecord::Base
      serialize :bar
    end
    

    不过,这是 hack。它会起作用,但您需要序列化所有其他现有记录(否则您会自找麻烦)。

    在尝试在旧版 UTF8 数据库上支持表情符号时,一直在尝试类似的想法,不幸的是,除了选择 UTF8mb4 之外,没有其他好的方法可以解决。

    如果您只对处理表情符号感兴趣,另一种选择是使用 emojimmy 之类的东西

    【讨论】:

    • 我确实将表格的字符集转换为 utf8mb4 但这并没有改变任何东西,我仍然遇到与以前相同的错误,序列化确实有效,但是正如你所说,这有点像黑客,所以除非绝对必要,否则我不会这样做
    • @akabhirav 您是否还更新了您的 database.yml 文件以使用 utf8mb4 编码而不是 utf8?根据blog.arkency.com/2015/05/…
    • 我只为一个表更改了字符集,是否可以在 database.yml 中为单个表进行更改
    • 如果不破解它就不行。你应该能够混合和匹配编码,所以只需尝试更改 database.yml 中的编码,看看会发生什么!如果您已经建立了包含数千条记录的数据库,那么最好的选择是使用 emojimmy 之类的东西。如果它相对较新且干净,则可能值得使用 utf8mb4 重新开始
    • 不能简单的改变表定义,还需要说明客户端有utf8mb4,而不仅仅是utf8。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 2013-03-27
    • 2016-03-31
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多