在MySQL中转换PHP json_encode UTF8十六进制实体

时间:2018-05-30 15:51:47

标签: php mysql json

在php中,json_encode()将在十六进制实体中编码UTF8,例如

json_encode('中'); // become "\u4e2d"

假设数据" \ u4e2d"现在存储在MySQL中,是否可以在不使用PHP的情况下从"\u4e2d"转换回,只是简单的MySQL?

2 个答案:

答案 0 :(得分:1)

在我的配置中,选择十六进制('中');返回E4B8AD 这是UTF8字节的十六进制代码。当然,它 与代码点4e2d的十六进制不同,但是你可以得到 用select hex(cast('中' as char(1)字符集utf16));.

更新:提问者编辑了这个问题,看起来像是一个完全不同的问题,现在它显然是:如何获得'中'给出一个包含' \ u4e2d'的字符串当4e2d是中的代码点时,默认字符集是utf8。好的,就是这样 选择cast(char(conv(右(' \ u4e2d',4),16,10)使用utf16)作为char(1)字符集utf8);

答案 1 :(得分:0)

将非ASCII字符编码为JavaScript实体只是JSON编码器所做的不同事情之一 - 而且它实际上并不是强制性的:

echo json_encode('中'), PHP_EOL;
echo json_encode('中', JSON_UNESCAPED_UNICODE), PHP_EOL;
echo json_encode('One "Two" Three \中'), PHP_EOL;
"\u4e2d"
"中"
"One \"Two\" Three \\\u4e2d"

因此,唯一安全的解码方法是使用专用的JSON解码器。 MySQL捆绑了自5.7.8以来所需的能力:

SET @input = '"One \\"Two\\" Three \\\\\\u4e2d"';
SELECT @input AS json_string, JSON_UNQUOTE(@input) AS original_string;
json_string                     original_string
============================    ===================
"One \"Two\" Three \\\u4e2d"    One "Two" Three \中

Demo

如果您使用的是旧版本,则必须采用更精细的解决方案(Google可以使用第三方UDF)。

无论如何,我建议你回到设计表。奇怪的是,在没有合适的JSON解码器的情况下,您需要JSON数据。