在 mysql 中保存 utf8mb4 字符而不更改 table 或数据库中的任何内容
Save utf8mb4 characters in mysql without changing anything in the table or db
我有一个utf8mb4字符需要保存在MySQL的一个列中。所有解决方案都指向删除 4 字节字符或更改 table 的排序规则或字符集。
我还注意到 Rails(ActiveRecord) 安全地转换为 \U0001F4A1 并将其存储在数据库中。我想知道 ActiveRecord 是如何做到的以及我该如何做到这一点
简答:
你不能这样做。如果你想在 mysql 中保存 4 字节字符,你需要使用 UTF8mb4
更长的答案:
以一种 hacky 的方式,您可以通过序列化来保存这样的字符。假设你的模型是 Foo 并且你保存 4 字节字符的列是 bar,你将有类似的东西:
class Foo < ActiveRecord::Base
serialize :bar
end
虽然这是黑客攻击。它会起作用,但您需要序列化所有其他现有记录(否则您是在自找麻烦)。
在尝试支持遗留 UTF8 数据库上的表情符号时一直在玩弄这样的想法,不幸的是,除了选择 UTF8mb4 之外,没有其他好的方法可以解决这个问题。
如果您只对处理表情符号感兴趣,另一种选择是使用 emojimmy
我有一个utf8mb4字符需要保存在MySQL的一个列中。所有解决方案都指向删除 4 字节字符或更改 table 的排序规则或字符集。
我还注意到 Rails(ActiveRecord) 安全地转换为 \U0001F4A1 并将其存储在数据库中。我想知道 ActiveRecord 是如何做到的以及我该如何做到这一点
简答: 你不能这样做。如果你想在 mysql 中保存 4 字节字符,你需要使用 UTF8mb4
更长的答案: 以一种 hacky 的方式,您可以通过序列化来保存这样的字符。假设你的模型是 Foo 并且你保存 4 字节字符的列是 bar,你将有类似的东西:
class Foo < ActiveRecord::Base
serialize :bar
end
虽然这是黑客攻击。它会起作用,但您需要序列化所有其他现有记录(否则您是在自找麻烦)。
在尝试支持遗留 UTF8 数据库上的表情符号时一直在玩弄这样的想法,不幸的是,除了选择 UTF8mb4 之外,没有其他好的方法可以解决这个问题。
如果您只对处理表情符号感兴趣,另一种选择是使用 emojimmy