首页 > 解决方案 > 查询保存 JSON 的 MYSQL 长文本

问题描述

我有一个具有以下结构的表:

CREATE TABLE `Event` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `created` datetime(6) NOT NULL,
  `last_updated` datetime(6) NOT NULL,
  `info` longtext NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=720 DEFAULT CHARSET=latin1

我需要使用info列(包含 JSON 字符串)来查询它。

如果我查询它:

SELECT e.id, e.created, JSON_TYPE(e.info) AS info
  FROM Event e

它在 INFO 列上返回 OBJECT,但如果我尝试获取 JSON 的特定列,我会收到:

SQL 错误 [3144] [22001]:数据截断:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值。

我正在运行的 SQL:

SELECT INFO - > '$User'
  FROM (SELECT e.id, e.created, JSON_TYPE(e.info) AS info
          FROM Event e) as X

它不是将列的类型更改为 json 的选项

标签: mysqljson

解决方案


你可以尝试CAST到 JSON 然后

SELECT info -> '$.User', info_type
  FROM (SELECT e.id, e.created, 
               JSON_TYPE( CAST( info AS JSON ) ) AS info_type, 
               CAST( info AS JSON ) AS info
          FROM Event e) as X

因为 JSON 值接受函数 ( JSON_TYPE()) 中的字符串值不起作用。

顺便说一句,对于您的情况,您不需要带上 JSON 类型,而只需要带上 JSON。

更新:您也可以不使用子查询使用JSON_EXTRACT()as

SELECT JSON_EXTRACT( CAST( info AS JSON ) , '$.A' ) AS info,
       JSON_TYPE( CAST( info AS JSON ) ) AS info_type
  FROM Event

推荐阅读