我有一个包含 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 "}
我不知道为什么会发生这种情况,我将不胜感激!