【问题标题】:JSON in Mysql and Unicode HexMysql 中的 JSON 和 Unicode Hex
【发布时间】:2020-11-07 07:22:48
【问题描述】:

在我的 mysql 5.7 数据库表中有一个字段描述,其中包含类似的值

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

我已经尝试过使用 SQL 查询:

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%'; 我得到了结果。

【问题讨论】:

  • 你的专栏是什么类型的?
  • 哦,对不起,我错过了。字段类型为 JSON

标签: mysql unicode


【解决方案1】:

这是INSERTing 时的客户端问题。如果您使用的是 PHP,请确保在调用 json_encode() 时包含 JSON_UNESCAPED_UNICODE。如果您正在使用其他客户端,请说出来。

【讨论】:

  • 看来你是对的,但是当我下次在项目上工作时,我会尝试使用学说来运行它,因为只有一个“正常”的 setter 函数:` /** * Set描述。 * * @param json|null $description * * @return 文章 */ public function setDescription($description = null) { $this->description = $description;返回$这个; }` 我不能覆盖 json_encode 函数。但是当我在数据库中手动设置为für 时,它可以工作。
  • 我现在发现了错误。问题是,这个领域有一个变压器。转换器已经编码为 JSON 并将其放入 json mysql 字段中。所以它是双json编码的。如果有人仍然对 unicode-chars 有问题,要么是你的安装设置错误,要么看这里:zgadzaj.com/development/php/symfony/…
【解决方案2】:

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 givesnull 和 "für"。 MySQL 8.0 givesfür和für。

尝试将您的database 或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%';

【讨论】:

  • 对不起,在我的情况下不起作用。我仍然没有得到结果。
  • @sneaky 我的错误,看起来这需要 MySQL 8。如果可以的话,我强烈建议升级,MySQL 8 带来了很多好的特性和修复。
  • @sneaky 您的 JSON 列中是否包含所有这些额外的转义和引号? select description from vender_article 应该显示 '{"1":"Glasvlies f\u00fcr Gipskartonfugen","2":"5 cm x 25 m Rolle"}'); 而不是 "{\"1\":\"Glasvlies f\\u00fcr Gipskartonfugen\",\"2\":\"5 cm x 25 m Rolle\"}"
  • 在控制台它显示"{\"1\":\"Glasvlies f\\u00fcr Gipskartonfugen\",\"2\":\"5 cm x 25 m Rolle\"}" 在PHPStorm 数据库控制台它显示"{\"1\":\"Glasvlies f\\u00fcr Gipskartonfugen\",\"2\":\"5 cm x 25 m Rolle\"}" 数据库已经是utf8mb4,表已经是utf8mb4_unicode_ci。顺便说一句,上面写的命令在 5.7 中必须是 alter table vendor_article convert to character set utf8mb4 collate utf8mb4_unicode_ci; 这在数据库上不起作用。
猜你喜欢
  • 2010-09-26
  • 2011-10-10
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多