【问题标题】:resultSet obtained if parameter containing whitespace concatenated, but not using setString如果包含空格的参数连接,但不使用 setString,则获取 resultSet
【发布时间】: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

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

【问题讨论】:

    标签: java sql-server jdbc jtds


    【解决方案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"

    【讨论】:

    • 哦,所以空格是查询的一部分,并且“显示”为整数?
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多