mysql - 查询保存 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 的选项
解决方案
你可以尝试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
推荐阅读
- android - 尽管我拥有所有资源文件,但 Android 资源链接失败 | 科特林
- c# - OneDrive REST API - 上传块时请求范围错误
- android - BaseFragment 与视图绑定
- git - git pull 后的文件没有变化
- python - ModuleNotFoundError:使用 Tensorflow 时没有名为“pandas”的模块
- python - 是否可以在模拟的不同步骤中抑制 Abaqus “Tie Constraint”?
- python - 计算几个数字的乘积的函数
- python - 比较和突出显示两个数据框单元格之间的字符串差异
- android - Windev Mobile 25 - 使用 Firebase 向多个设备推送通知
- react-native - ReactEditText.java 第 149 行