You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从MySQL 5.7迁移至MariaDB 10.6.5后SQL查询语法错误求助

MySQL查询迁移MariaDB后JSON语法报错的修复方案

错误信息

Uncaught Exception: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'JSON) FROM attributes AS _sub_attr WHERE JSON_EXTRACT(sub_prop_attr.attrib_te...' at line 1 query: SELECT *,p.id AS id, DATEDIFF(CURDATE(),DATE(p.created)) AS days, COALESCE(bed_room,bath_room,parking,construction_size,lot_size,floors,building_age) AS chs , (SELECT JSON_OBJECTAGG(attribute_name, (SELECT CAST(CONCAT('[',GROUP_CONCAT(JSON_QUOTE(_sub_attr.attribute_name)),']') AS JSON) FROM attributes AS _sub_attr WHERE JSON_EXTRACT(sub_prop_attr.attrib_terms, JSON_UNQUOTE(JSON_SEARCH(sub_prop_attr.attrib_terms, 'one', _sub_attr.id))) IS NOT NULL)) FROM prop_attributes AS sub_prop_attr LEFT JOIN attributes AS sub_attr ON sub_prop_attr.attribute_id = sub_attr.id WHERE prop_id = p.id) AS JSON_attributes FROM properties p LEFT JOIN (SELECT id, state_name, CONCAT("en ",state_name) AS state_alias FROM states) s on p.state=s.id LEFT JOIN (SELECT id, city_na in C:\wamp64...\classes\MysqliDb.php on line 1819

问题根源

报错核心是MySQL与MariaDB在JSON函数语法/兼容性上的差异:

  • 手动用CONCAT+GROUP_CONCAT拼接JSON数组后CAST AS JSON的写法,在MariaDB中存在语法解析逻辑差异,触发语法错误。
  • JSON_EXTRACT+JSON_UNQUOTE+JSON_SEARCH的组合写法冗余,且在MariaDB中容易出现解析异常。

修复方案

改用原生JSON聚合函数替代手动拼接,同时优化JSON存在性检查逻辑,确保跨数据库兼容:

修改后的PHP查询片段

$Srelated_attributes = ", (SELECT JSON_OBJECTAGG(attribute_name, (SELECT JSON_ARRAYAGG(JSON_QUOTE(_sub_attr.attribute_name)) FROM attributes AS _sub_attr WHERE JSON_CONTAINS(sub_prop_attr.attrib_terms, CAST(_sub_attr.id AS JSON), '$') IS NOT NULL)) FROM prop_attributes AS sub_prop_attr LEFT JOIN attributes AS sub_attr ON sub_prop_attr.attribute_id = sub_attr.id WHERE prop_id = p.id) AS JSON_attributes";

关键修改点

  1. 替换手动JSON数组拼接:
    原写法用CONCAT('[',GROUP_CONCAT(...),']')手动拼数组再转JSON,改为JSON_ARRAYAGG(JSON_QUOTE(_sub_attr.attribute_name)),直接生成标准JSON数组,避免转义与CAST语法问题。

  2. 优化JSON存在性检查:
    用JSON_CONTAINS(sub_prop_attr.attrib_terms, CAST(_sub_attr.id AS JSON), '$')替代JSON_EXTRACT+JSON_UNQUOTE+JSON_SEARCH的组合,逻辑更简洁,且在MySQL和MariaDB中行为完全一致。

  3. 版本兼容性确认:
    确保使用的MariaDB版本≥10.2(该版本开始全面支持JSON函数),若版本过低需升级数据库。

验证

修改后查询可在MariaDB和MySQL环境下同时正常运行,移除了原有的语法兼容问题,且JSON生成逻辑更可靠。

内容的提问来源于stack exchange,提问作者Adrian Vignolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:35:26