如果包含空格的参数连接,但不使用 setString,则获取 resultSet
Posted
技术标签:
【中文标题】如果包含空格的参数连接,但不使用 setString,则获取 resultSet【英文标题】:resultSet obtained if parameter containing whitespace concatenated, but not using setString 【发布时间】:2012-07-23 13:23:44 【问题描述】:我有这段代码,带有一个准备好的语句。我知道查询是多余的。参数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
我想知道为什么驱动程序忽略了第二段代码中的空白,但在第一部分有问题。
【问题讨论】:
【参考方案1】:如果你使用setString
,参数将被绑定为一个字符串,从而产生这个SQL(考虑到绑定参数是一个SQL字符串):
SELECT RSCode as id FROM Customer WHERE RSCode=' 0123';
如果您使用连接,则使用的 SQL 将是(将连接的值视为整数,因为作为 SQL 语法的一部分,空格将被忽略):
SELECT RSCode as id FROM Customer WHERE RSCode=<space>0123;
在这种情况下,我建议将其转换为 int
或 long
或其他任何类型,并将其绑定到正确的类型。使用setInt()
或setLong()
。
如果你的字段是一个字符串,你可以首先使用例如:
String normalizedValue = String.trim(value);
newPrepStatement.setString(1, normalizedValue);
甚至直接在 SQL 中,例如:
SELECT RSCode as id FROM Customer WHERE RSCode=TRIM(?);
【讨论】:
但不会将"SELECT RSCode as id FROM Customer WHERE RSCode=" + id;
扩展为"SELECT RSCode as id FROM Customer WHERE RSCode=' 0123';
吗?空格还是要数的,对吧?
不,它将是“SELECT RSCode as id FROM Customer WHERE RSCode= 0123;”
并且应该避免连接(考虑SQL注入)
@ftom2 那么,驱动程序在连接时会修剪空格吗?
@FranciscoSpaeth 我正在更改所有查询以使用准备好的语句,当我遇到这个问题时,出于同样的原因:)【参考方案2】:
在场景 1 中,查询将如下所示
"SELECT RSCode as id FROM Customer WHERE RSCode='413530'"
在场景 2 中,查询将如下所示
"SELECT RSCode as id FROM Customer WHERE RSCode= 413530"
【讨论】:
哦,所以空格是查询的一部分,并且“显示”为整数?以上是关于如果包含空格的参数连接,但不使用 setString,则获取 resultSet的主要内容,如果未能解决你的问题,请参考以下文章