ruby - 将utf8mb4字符串保存到mysql

标签 ruby unicode mysql2 emoji

我有一个包含 utf8mb4 字符的 JSON 字符串。我首先解析 JSON,然后将结果编码回 JSON。之后,我将生成的 JSON 保存到 mysql 数据库。 (这是一个简化的执行流程,我首先解析 JSON 然后将其编码回来是有现实原因的)。

问题是数据库以我放在那里的 JSON 字符串的前缀结束,并且它在第一个 utf8mb4 字符处被截断。

这是我的代码:

require 'json'
require 'mysql2'

TABLENAME = 'my_table'

settings = {
  :database => "my_database",
  :host => "localhost",
  :password => "my_password",
  :username => "my_username"
}

@database = Mysql2::Client.new settings
@json = %q({"test":"begin \ud83d\ude04\ud83d\udc4d\ud83d\udc4f\ud83d\udd14 end"})

begin
  obj = JSON.parse @json
rescue JSON::ParserError => e
  @json.force_encoding 'utf-8'
  encoded = @json.valid_encoding? ? @json : @json.encode!('utf-8', invalid: :replace, undef: :replace)
  obj = JSON.parse encoded
end

q = "create table if not exists `#{TABLENAME}` (json text not null) engine=InnoDB default charset=utf8"
@database.query q

text = @database.escape JSON.generate obj
q = "insert ignore into `#{TABLENAME}` (json) values('#{text}')"
@database.query q

q = "select * from `#{TABLENAME}`"
rs = @database.query q

rs.each {|r|
  p r
}

输出是:

{"json"=>"{\"test\":\"begin "}

我不知道为什么会发生这种情况,我将不胜感激任何帮助!

最佳答案

感谢@muistooshort 帮助我找到解决此问题的方法:

...
settings = {
  ...
  :encoding => 'utf8mb4'
}
...
q = "create table ... default charset=utf8mb4"
...

当然,这仅适用于支持 utf8mb4 的引擎。

关于ruby - 将utf8mb4字符串保存到mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15824956/

相关文章:

ruby - Chef 和 erb 模板。如何使用 bool 代码块

postgresql - 如何在 Mac OS X Leopard 上为 Rails 3.X 编译 sqlite3、mysql 和 postgres 驱动程序?

python - regex.WORD 如何影响\b 的行为?

Java Unicode 翻译

Delphi 2010 宽函数与字符串函数

mysql - Rails 3 和 MySQL 的问题与 ActiveSupport 中的 JSON 依赖相关

更新和所有其他功能的 Mysql 语法错误

Ruby Shoes : using . 点击图片无法区分左击和右击

ruby-on-rails - 从旧版 ruby​​/rbenv 迁移的问题

arrays - 遍历 Ruby 中的哈希数组(解析 JSON)