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

如何在PreparedStatement中转义单引号并解决SQLServerException索引越界错误

问题根源

你遇到的报错本质是SQL语句硬编码拼接的字符串中包含未转义的单引号,破坏了SQL的整体结构:Best's里的单引号提前闭合了你写的字符串前缀单引号,导致后续的directory_id=?被识别为字符串的一部分,JDBC驱动无法识别到参数占位符,认为你的SQL没有需要赋值的参数,调用setLong(1, dirId)时自然会报索引超出范围的错误。

正确解决方案

强烈不建议手动转义单引号拼接SQL,直接使用PreparedStatement的参数占位符处理所有动态参数,驱动会自动完成转义,同时避免SQL注入风险,正确写法如下:

调整SQL语句

把IN条件里的硬编码字符串也替换为参数占位符:

select group_id,group_name,directory_id from csr_dim_group where group_name IN (?) and directory_id=?

调整Java赋值逻辑

按占位符的顺序依次赋值即可:

PreparedStatement statement = getStatement(sql);
// 第一个占位符对应group_name的查询值,JDBC自动处理单引号转义
statement.setString(1, "RG-Actuary SecShared Best's Week");
// 第二个占位符对应directory_id
statement.setLong(2, dirId);
rs = statement.executeQuery();

如果IN子句需要传入多个值,你可以根据参数数量动态生成对应个数的?占位符,再循环调用set方法赋值即可。

特殊场景的手动转义方案(仅作了解,禁止生产环境使用)

如果确实有特殊场景必须硬编码字符串到SQL中,SQL Server的单引号转义规则是将1个单引号替换为2个连续的单引号,修改后的SQL如下:

select group_id,group_name,directory_id from csr_dim_group where group_name IN ('RG-Actuary SecShared Best''s Week') and directory_id=?

这种写法容易遗漏转义引发SQL注入漏洞,不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:45:03