JDBC 特殊符号对于特殊符号&查询,和数据库不一致

tujiazu 2010-12-24 09:15:39
我表中有这样3条数据
ID NAME
1 &@**
2 &&
3 *__%&'

对于_,%,用ESCAPE 转义,’写两遍
但是对于“&”这个符号,写两遍,ORACLE查询的结果是对的
select * from t_test where name like '%&&%' 能够查出上面的4条记录
这条语句的意思 是查询NAME 中含有&的数据。

但是写在JAVA中就查不出来了,我怀疑是JDBC的一种安全策略(防注入),求解答
Connection conn = getConn();

conn.prepareStatement(sql);
try {
pst = conn.prepareStatement(sql);
rs = pst.executeQuery(sql);
while(rs.next())
{
System.out.println("----->"+rs.getString(2));
}
} catch (SQLException e) {

e.printStackTrace();
}finally{
rs.close();
pst.close();
conn.close();
}


...全文
613 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingyuan18 2010-12-25
  • 打赏
  • 举报
回复
试试用prepareStatement,参数方式注入
Leonhe2022 2010-12-25
  • 打赏
  • 举报
回复
不用 管他实现的细节了。
在数据库控制台使用2个&去查,JDBC就是用1个&
「已注销」 2010-12-25
  • 打赏
  • 举报
回复
JDBC 肯定会对&处理,但不知道是如何进行转义的。这样造成了一种麻烦。sql语句是对的,但是通过jdbc后,查询的结果就可能不一样。

Leonhe2022 2010-12-25
  • 打赏
  • 举报
回复
JDBC本身会对 & 特殊字符进行转义处理1次, 所以使用JDBC操作时,SQL语句不用转义啦。


。。。。。where t.name like '%&%'
unbachone 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tujiazu 的回复:]

因为& 不是mysql的特殊字符,所有可以查出来,但 & 是Oracle的特殊字符啊
比如我输入:
select * from t_test where name like '%&&%';
能查到
1 &**
2 &
3 &&

但是通过JAVA就查询一条数据,这是什么原因呢。这个&符号有什么诡异啊。
……
[/Quote]

原来如此,印象中还是学过escape之类的,居然都忘光了,惭愧。
也没Google到相关资料,帮不了你了。
「已注销」 2010-12-24
  • 打赏
  • 举报
回复
输入两遍& 相当于把&转义了。
「已注销」 2010-12-24
  • 打赏
  • 举报
回复
因为& 不是mysql的特殊字符,所有可以查出来,但 & 是Oracle的特殊字符啊
比如我输入:
select * from t_test where name like '%&&%';
能查到
1 &**
2 &
3 &&

但是通过JAVA就查询一条数据,这是什么原因呢。这个&符号有什么诡异啊。
unbachone 2010-12-24
  • 打赏
  • 举报
回复
我现在的机器上没装Oracle,用MySQL测试了一下,发现&&只能查询到一条。



在Java上也是可以查询到这一条。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {

public static void main(String[] args) {

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

try {
conn = DriverManager.getConnection("jdbc:mysql://localhost/bc?" +
"user=root&password=Bao880831");
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from t_test where name like '%&&%'");
while (rs.next()) {
System.out.println(rs.getString("name")); // 输出 &&
}

} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}

}

}

Leonhe2022 2010-12-24
  • 打赏
  • 举报
回复
我用mysql测试了下,没使用escape,使用反斜杠转义,查询正常:


select * from user1 as u WHERE u.`name` LIKE '%\\&%'

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧