JSON 在 Mysql 和 Unicode Hex

JSON in Mysql and Unicode Hex

在我的 mysql 5.7 数据库 table 中有一个字段描述包含像

这样的值

"{\"1\":\"Glasvlies f\u00fcr Gipskartonfugen\",\"2\":\"5 cm x 25 m Rolle\"}" 我想从 symfony 3.4 项目中搜索 für Gipskartonfugen

我已经尝试过 SQL-query:

SELECT * FROM vendor_article v0_ WHERE v0_.description LIKE ?;

WHERE 描述是 %für Gipskarton%%f\\u00cfr Gipskarton%%f\u00cfr Gipskarton% 但没有得到任何结果。

结果相同 SELECT * FROM vendor_article v0_ WHERE CONCAT(v0_.description) LIKE ?;

但是当我搜索 SELECT * FROM vendor_article WHERE description LIKE '%\u00%'; 我得到了结果。

MySQL 5.7 似乎在 JSON 中存在转义 Unicode 的真正问题。我最初以为是因为默认字符集是 latin1,但事实并非如此。

create table vender_article (
  description json not null
) character set utf8mb4;

insert into vender_article values ('"f\u00fcr"'), ('"für"');

select * from vender_article;

MySQL 5.7 gives null and "für". MySQL 8.0 gives fürfür.

尝试将 database or server 字符集更改为 utf8mb4,看看是否有帮助。我不能在 dbfiddle 上执行此操作。

alter database <your database> character set utf8mb4 collation utf8_unicode_ci

或者,在插入之前取消转义 JSON。

或者,更新到 MySQL 8。这将提供许多功能和错误修复,包括更好的 Unicode 和 JSON 支持。


如果您将该列存储为 [`JSON`](https://dev.mysql.com/doc/refman/5.7/en/json.html) 它将理解unicode转义。

这也为您提供了适当的 JSON functions

SELECT * FROM vendor_article where description->"$.*" like '%für Gipskartonfugen%';

这是 客户端INSERTing 时的问题。如果您使用 PHP,请务必在调用 json_encode() 时包含 JSON_UNESCAPED_UNICODE。如果您使用的是其他客户端,请说明。