我有这段代码,带有准备好的语句。我知道查询是多余的。参数 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;
在这种情况下,我建议将其转换为 int
或 long
或任何类型,并将其绑定(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/