java - 如果参数包含空格连接,但不使用 setString,则获得 resultSet

标签 java sql-server jdbc jtds

我有这段代码,带有准备好的语句。我知道查询是多余的。参数 id是一个字符串 <space>413530 (“413530”)。请注意前面的空白字符。

String query = "SELECT RSCode as id FROM Customer WHERE RSCode=?";

PreparedStatement newPrepStatement = connection
        .prepareStatement(query);
newPrepStatement.setString(1, id);
resultSet1 = newPrepStatement.executeQuery();

while (resultSet1.next()) {
    System.out.println("Got a result set.");
    logindata.add(resultSet1.getString("id"));
}

执行此查询后我没有得到任何结果。

现在,如果我使用相同的语句并将参数附加为字符串的一部分,如下所示:

String query = "SELECT RSCode as id FROM Customer WHERE RSCode=" + id;

PreparedStatement newPrepStatement = connection
        .prepareStatement(query);
resultSet1 = newPrepStatement.executeQuery();

while (resultSet1.next()) {
    System.out.println("Got a result set.");
    logindata.add(resultSet1.getString("id"));
}

我在执行这个准备好的语句后得到了一个结果。同样适用于 java.sql.statement

我想知道为什么驱动程序忽略了第二段代码中的空格,但在第一部分中却有问题。

最佳答案

如果您使用 setString,参数将被绑定(bind)为一个字符串,从而生成此 SQL(将绑定(bind)参数视为一个 SQL 字符串):

SELECT RSCode as id FROM Customer WHERE RSCode=' 0123';

如果您使用串联,则使用的 SQL 将是(将串联值视为整数,因为空格将作为 SQL 语法的一部分被忽略):

SELECT RSCode as id FROM Customer WHERE RSCode=<space>0123;

在这种情况下,我建议将其转换为 intlong 或任何类型,并将其绑定(bind)到正确的类型。使用 setInt()setLong()

如果你的字段是一个字符串,你可以首先使用例如规范化它:

String normalizedValue = String.trim(value);
newPrepStatement.setString(1, normalizedValue);

甚至直接在 SQL 中,如:

SELECT RSCode as id FROM Customer WHERE RSCode=TRIM(?);

关于java - 如果参数包含空格连接,但不使用 setString,则获得 resultSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11613418/

相关文章:

java - JAR 创建后 UCanAccess 不工作

java - JMockit - 意外调用

java - 从 Java 调用 C++ 函数

c# - 如何在sql server中将参数传递给IN

sql - 如何在一个查询中最大化(日期)和使用 sql server 中的 in 功能?

sql-server - 使用 SMO 还原数据库时 SQL Server 超时

java - 是否存在竞争条件,或者对同一对象的同一方法进行多次调用时如何工作

java - struts2 + java分页中实现动态pagesize

java jdbc insert 在oracle db中触发触发器

java - 如何使用复合类型数组调用 postgres 函数