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

查询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 paddle库安装时报错提示需要安装common、dual等库,安装了上面的库以后还是显示报错未安装,要怎么办呀?
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?
  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题