如果包含空格的参数连接,但不使用 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;

在这种情况下,我建议将其转换为 intlong 或其他任何类型,并将其绑定到正确的类型。使用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的主要内容,如果未能解决你的问题,请参考以下文章

C 预处理器宏参数在末尾带有空格以进行连接?

构建包含空格的参数列表

在连接时发送 Websocket 参数但不发送查询字符串

leetcode-58.最后一个单词的长度

最后一个单词的长度

Spyder 通过 pip 安装但不可见