查不到数据应先确认json字段是否为原生json类型且内容合法:执行show columns确认type为json,select version()确保≥5.7,用json_valid()验证值有效性,显式过滤null和非法json,并用原生sql排除tp封装干扰。

查不到数据,第一反应不该是改条件,而是确认字段本身是否“可被JSON查询”——TP 8.1.0 对 MySQL JSON 字段的查询依赖底层类型支持,类型不对,语法再对也返回空。
确认字段是否为原生 JSON 类型
在数据库中执行:
SHOW COLUMNS FROM 表名 LIKE '字段名';重点看 Type 列是否显示 json。如果是 varchar、text 或 longtext,那就不能用 ->> 或 -> 语法,否则查询静默为空或报错。
同时验证 MySQL 版本:
SELECT VERSION();必须 ≥ 5.7(推荐 8.0+),否则 JSON 函数不可用。
检查字段值是否真为合法 JSON
即使类型是 json,字段内容也可能不是有效 JSON(比如存了空字符串、纯数字、HTML 片段或损坏的 JSON)。手动查几条原始值:
-
is_valid = 0:说明该行字段内容不是合法 JSON,JSON_EXTRACT等函数一律返回NULL -
is_valid = 1但查询仍为空:继续查路径是否写错、大小写是否匹配、是否含不可见字符
排除 NULL 和空值干扰
JSON 查询对 NULL 值完全不敏感,info->>'$.name' 在 info IS NULL 时直接返回 NULL,导致 WHERE 条件失效。务必显式过滤:
- 加
whereNotNull('字段名')(TP 写法) - 或 SQL 层加
AND 字段名 IS NOT NULL AND JSON_VALID(字段名)
否则哪怕其他条件全对,结果集也是空的。
快速验证查询语法是否生效
绕过 TP 封装,用原生 SQL 直接测:
SELECT info->>'$.email' AS email FROM user WHERE info->>'$.email' = 'test@example.com';如果这条在 MySQL 客户端里也返回空,问题一定出在数据侧;如果能查到,再回头检查 TP 的连接配置、字段映射或模型设置是否误转义。











