java使用sql语句中使用like来传参数出现java.util.UnknownFormatConversionException:Conversion=

今天在修改一个很古老项目的时候,有一个需求就是要在sql查询里使用like来传递参数,进行模糊查询。

如下所示:

 sql_Static_person = String.format(
      "select * from t_info where HD='%s' and (GG='%s' or GG is null) 
and BS<=1 and ZH='%s' and flag=0 and bz like %s ",aa(), bb(), cc(),dd());

其实需求很简单,就是把dd()的参数值直接传到bz like 后的%s里,尝试里很多办法,一开始使用concat进行连接,发现总是出现

Conversion = '''的错误,java.util.UnknownFormatConversionException:Conversion=''';

 sql_Static_person = String.format(
      "select * from t_info where HD='%s' and (GG='%s' or GG is null) 
and BS<=1 and ZH='%s' and flag=0 and bz like concat('%',%s,'%') ",aa(), bb(), cc(),dd());

看着报错,应该是数据格式的问题,于是又想到里转义,如下所示:

 sql_Static_person = String.format(
      "select * from t_info where HD='%s' and (GG='%s' or GG is null) 
and BS<=1 and ZH='%s' and flag=0 and bz like concat(\'%\',%s,\'%\') ",aa(), bb(), cc(),dd());

很遗憾还是出现同样的错误,于是突然想到String.format处理%的转义应该不是这种形式,应该是%% 对% 进行转义,于是如下所示:

 sql_Static_person = String.format(
      "select * from t_info where HD='%s' and (GG='%s' or GG is null) 
and BS<=1 and ZH='%s' and flag=0 and bz like '%%%s%%' ",aa(), bb(), cc(),dd());

代码成功运行,说明一点,java基础忘记差不多了。。。

 

还有一点,奉劝不要这么在代码里写SQL,如果暴露的互联网上,且存在安全信息,就会存在SQL注入问题,要避免这样写。

 

`java.util.UnknownFormatConversionException: Conversion = ';'` 是 Java 中在使用 `System.out.printf()`、`String.format()` 或 `Formatter` 类进行格式化输出抛出的异常,表示使用了 **不被识别的格式化转换符**(如 `';'`)。 --- ### 🔍 异常原因 该异常通常发生在你使用 `printf` 或 `String.format` ,格式字符串中包含了非法的格式标识符。例如: ```java System.out.printf("百分比: %d%%; 成绩: %s%n", 95.5, "优秀"); ``` 上面的代码中,格式字符串里使用了 `%;`,而 `;` 并不是一个合法的格式化字符,所以会抛出: ``` java.util.UnknownFormatConversionException: Conversion = ';' ``` --- ### ✅ 正确写法示例 如果你只是想原样输出分号 `;`,**不要把它放在格式字符串的格式符位置**,而是直接作为普通字符输出。 #### ✅ 示例 1:正确使用格式化字符串 ```java double percentage = 95.5; String grade = "优秀"; System.out.printf("百分比: %.1f%%; 成绩: %s%n", percentage, grade); ``` 输出: ``` 百分比: 95.5%; 成绩: 优秀 ``` 注意:`%.1f` 表示保留一位小数的浮点数,`%s` 表示字符串,`%n` 表示换行。 --- #### ✅ 示例 2:字符串拼接替代格式化 如果你不确定格式字符串的写法,也可以使用字符串拼接来避免错误: ```java System.out.println("百分比: " + 95.5 + "%; 成绩: 优秀"); ``` --- ### 📌 常见格式符参考 | 格式符 | 含义 | 示例 | |--------|-------------------|--------------| | `%d` | 整数 | `System.out.printf("%d", 100);` → `100` | | `%f` | 浮点数 | `%.2f` → 保留两位小数 | | `%s` | 字符串 | `"Hello"` | | `%c` | 字符 | `'A'` | | `%b` | 布尔值 | `true`/`false` | | `%n` | 换行符(平台无关) | | --- ### ❗ 常见错误写法(导致该异常) ```java System.out.printf("结果是: %d;%n", 100); // 分号在格式符中,不会出错,但如果写成 %; 就会报错 ``` --- ### ✅ 总结解决方法 1. 检查格式字符串中是否使用了非法的格式符(如 `%x`,其中 `x` 不是合法类型)。 2. 如果只是想输出 `%` 或 `;` 等符号,请不要将其放在格式参数位置。 3. 使用 `String.format()` 或 `printf()` ,确保格式字符串和参数类型匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值