2012-07-23 45 views
1

我有這段代碼,有一個準備好的語句。我知道這個查詢是多餘的。參數id是字符串<space>413530(「413530」)。請注意前面的空格字符。resultSet如果參數中包含空白連接,但不使用setString

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

如果使用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或不管它是什麼,並將其綁定機智h是正確的類型。用setInt()setLong()

如果你字段是一個字符串,你可以首先使用如歸:

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

,甚至直接在像SQL:

SELECT RSCode as id FROM Customer WHERE RSCode=TRIM(?); 
+0

但不會' 「選擇RSCode的ID從客戶WHERE RSCode =」 + ID;'是擴展爲'「SELECT RSCode as id FROM Customer WHERE RSCode ='0123';'?空白仍然需要計數,對吧? – theTuxRacer 2012-07-23 13:26:58

+0

不,它會是「SELECT RSCode as id FROM Customer WHERE RSCode = 0123;」 – Tomer 2012-07-23 13:27:30

+1

應該避免連接(考慮SQL注入) – 2012-07-23 13:28:45

1

在情景 - 1,查詢會看這樣

「選擇RSCode的ID從客戶WHERE RSCode =」 413530' 」

在方案 - 2,查詢將看起來像這樣

「選擇RSCode的ID從客戶WHERE RSCode = 413530」

+0

哦,所以空間是查詢的一部分,並且「顯示」爲整數? – theTuxRacer 2012-07-23 13:40:30