查询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语句到数据库直接查询,请问这种情况如何处理?

基于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

将SQL中的“$”替换为“\ $”来进行转义处理,在编写SQL语句时,最好使用参数化查询,这样可以有效地防止SQL注入攻击。