2014-07-11 248 views
2

我想使用JDBC爲我的sql數據庫添加一個字符串。但問題是,無論何時字符串包含雙引號,那麼sql命令的解釋將完全不同,並且「您的SQL語法中有錯誤;請檢查與您的MySQL服務器版本對應的正確語法的手冊」get thrown 」如何將包含雙引號的字符串添加到sql數據庫?

例如, 字符串ssql = 「INSERT INTO TABLENAME VALUES(\」 「+串+ 」\「)」;

如果字符串= 「ABC」,然後SQL = INSERT INTO TABLENAME VALUES( 「ABC」)
但是,如果字符串= 「AB \」 CD 「然後SQL = INSERT INTO TABLENAME VALUES( 」AB「 C」)


因此,對於包含雙引號的字符串,sql命令的解釋完全不同。

如何添加這樣的字符串到數據庫。

PS。我不能將雙引號改爲單引號。還有其他的黑客可以添加這樣的字符串,但我想知道是否真的沒有這種直接添加這樣的字符串的方式。

+0

可能重複的[MySQL引號,雙引號混亂](http://stackoverflow.com/questions/20827036/mysql-quotes-double-quotes-mess) – mc110

回答

0

我試圖通過轉義雙引號添加字符串,但沒有奏效。我可以添加字符串的唯一方法是使用PreparedStatement而不是Statement類。

String string = "abc\"abc"; 
String sql = "INSERT INTO tableName VALUES(?)"; 

connection = DriverManager.getConnection(DB_URL, USER, PASS); 
preparedStatement = connection.prepareStatement(sql); 
preparedStatement.setString(1, string); 
preparedStatement.executeUpdate(); 

該代碼段成功將包含雙引號的字符串添加到數據庫中。

0

MySQL Spec它重新調整\"作爲轉義雙引號。你可以如用兩個雙引號""逃脫雙引號"字符

\ 「雙引號(「」」)字符

0

改變這種

String ssql = "INSERT INTO tableName VALUES (\""+ string + "\")";

String ssql = "INSERT INTO tableName VALUES ('"+ string + "')"; 

,或者當你要插入你需要逃出他們這樣

String ssql = "INSERT INTO tableName VALUES (?)"; 
preparedStatement.setString(1,"\"string\""); 

這事應在表中插入"string"雙引號,像這樣

String ssql = "INSERT INTO tableName VALUES (?)"; 
preparedStatement.setString(1,"string"); 

一個PreparedStatement簡化它

1

您正在經歷良性SQL注入。幸運的是string不是Little Bobby Tables

相反,您應該使用參數化查詢,如INSERT INTO tableName VALUES (?),並通過參數發送值string

有關詳細信息,請參閱http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html


的JDBC文檔現在,來回答這個問題:假設字符串不是來自用戶來源,而是你想你自己,你寫的查詢可以在連接之前用字符串替換"\"

2

您需要轉義字符串值以在查詢中創建字符串文字。

當您使用引號來分隔字符串:

  • 字符串中的反斜槓(\)應該用兩個反斜線來代替。

  • 字符串中的引號(")應該用反斜槓和引號替換。

如果你想使用單引號(')來分隔字符串(這是在SQL多見),你會逃脫撇號,而不是引號。

如果可能,應該使用參數化查詢,而不是將值連接到查詢中。

相關問題