1

我有这段代码,带有准备好的语句。我知道查询是多余的。参数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

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

4

2 回答 2

4

如果您使用setString该参数将被绑定为导致此 SQL 的字符串(将绑定参数视为 SQL 字符串):

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

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

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

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

如果您的字段是一个字符串,您可以首先使用例如:

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

甚至直接在 SQL 中,例如:

SELECT RSCode as id FROM Customer WHERE RSCode=TRIM(?);
于 2012-07-23T13:25:22.360 回答
1

在场景 1 中,查询将如下所示

“从客户那里选择 RSCode 作为 ID,其中 RSCode='413530'”

在场景 2 中,查询将如下所示

“从客户那里选择 RSCode 作为 id,其中 RSCode=413530”

于 2012-07-23T13:32:12.450 回答