大海里的一粒星辰 2023-03-01 17:19 采纳率: 100%
浏览 35
已结题

查询mysql8时,SQL包含$符号程序无法查询

Java在查询mysql8.0时,sql条件中包含$符号,导致无法查询。求解!
数据库【sheet_data】表中字段“data”为JSON类型存储,数据格式为一个数组,

例:“[[1,2,3],[a,b,c]]

sql为:

select s.data ,jt.name
from sheet_data s
,json_table(
s.data,
'$[*]' columns(
`group` varchar(50) path '$[0]',
`name` varchar(50) path '$[1]'
)) as jt
where id = 1

情况描述:
1)此条SQL直接在数据库中运行正常,但是通过程序无法执行,排查原因是 SQL条件及JSON_TABLE中不能包含“$”符号;

2)java查询使用了mybatis和jdbcTemplete两种方式查询,均不能通过;

3)但有一个奇怪的现象,公司安装的一个mysql8.0.31版本,此SQL通过程序[jdbcTemplete]方式正常查询,mybatis不行,但是本地8.0.32和服务器8.0.30两个mysql版本均不能查询,提示语法错误、字符错误;

4)个人猜测是数据库配置的问题,但又不知道哪里配置,网上完全没有资料显示;

5)查询是直接前端传递sql语句到数据库直接查询,请问这种情况如何处理?

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-03-01 17:24
    关注

    基于Monster 组和GPT的调写:
    在SQL中,$符号通常用于引用JSON字段,如果SQL条件中包含$符号,MySQL会认为它是一个JSON字段的引用而导致语法错误。为了解决这个问题,可以使用转义符将$符号转义,例如:

    select s.data ,jt.name
    from sheet_data s
    ,json_table(
    s.data,
    '$[*]' columns(
    `group` varchar(50) path '\$[0]',
    `name` varchar(50) path '\$[1]'
    )) as jt
    where id = 1
    
    
    

    这样就可以成功查询了。

    如果在不同的MySQL版本中表现不同,可能是因为不同的版本对SQL语法的解析方式略有不同。建议使用最新版本的MySQL,并确保将转义符正确应用于SQL条件中的$符号。

    另外,对于直接将前端传递的SQL语句到数据库查询这种做法,不太安全,容易受到SQL注入攻击。建议使用参数化查询等更加安全的方式来执行数据库查询。aa

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 已采纳回答 3月1日
  • 创建了问题 3月1日

悬赏问题

  • ¥15 matlab学期例题代码答疑
  • ¥50 Hadoop:好友推荐
  • ¥15 在线手电筒追加按钮JS
  • ¥15 调用函数时,无关变量的改变引起函数值的改变
  • ¥15 xy坐标转化为经纬度坐标
  • ¥15 一般三角模糊数的上界值和下届值取中值的多少比较合理?
  • ¥15 cuda安装使用问题
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥20 Hbase启动失败,无法启动HMaster
  • ¥20 Lumerical FDTD solutions 中模型的相对阻抗,有效介电常数和有效磁导率的实部和虚部的数据如何获得?