大海里的一粒星辰 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 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果