2013-05-21 130 views
-1

當我從Xml讀取一些文本並將其放入數據庫時​​,如果文本包含'(撇號),我會收到錯誤。如何在插入數據庫時​​解決此問題。如何逃脫'(撇號)在MySQL?

+1

請勿轉義 - * *如果在原始SQL中編寫手動處理, [*在所有其他情況下使用佔位符*](http://stackoverflow.com/a/60496/2246674)(適用於語言)。另請參閱[字符串文字語法]的官方MySQL參考(http://dev.mysql.com/doc/refman/5.7/en/string-literals.html)。 – user2246674

+0

使用您正在使用的編程語言的正式轉義機制。不要手工逃脫,因爲還有其他角色也需要轉義,而且手動執行這樣的操作幾乎總是存在缺陷,並且會讓您容易受到攻擊。 – Spudley

+0

簡單!使用Prepared語句。 – Naveen

回答

2

哪裏有撇號是在它之前加一個\(反斜槓)。使用你的文本編輯器做一個查找和替換所有'\'應該工作。小心不要搞亂XML結構。

ex。

約翰

有待

約翰\的

您也可以使用PHP或C#也逃脫它。 這裏是PHP function

0

我不知道您用於導入的語言或方法。通常它是反斜線字符\。所以你需要用'替換'。合理?

+0

不改變我的XML我怎麼才能在Java中實現這一點? – Naveen

+1

使用準備好的語句:) – Naveen

1

您應該始終使用任何語言特定的方法來輸入數據。對於MySQL轉義字符是\。另一種選擇是使用帶有參數化輸入的預準備語句。這將消除逃避單撇號的需要。

我的猜測是,你的做事方式也有一個重要的SQL注入漏洞。如果您甚至沒有轉義輸入值或使用參數化準備語句,那麼可以將惡意代碼輕鬆注入到XML中。

+0

如果我使用準備好的語句,我不需要修改我的xml以替換'/'的權利? – Naveen

+0

@Naveen如果使用參數化輸入,則這是正確的。如果您只是使用查詢中包含的輸入執行正常的SQL查詢,並嘗試準備/執行它,它仍會失敗。 –

+0

我試着準備好的聲明,但它拋出相同的錯誤。它依賴於數據庫中的數據類型嗎?我正在使用longtext。 – Naveen

0

9.1.1 String Literals在MySQL參考:

有幾種方式,包括字符串中的引號字符:

A「「」加引號的字符串內「」」可以寫成「 ''」。

用「」引用的字符串內的「」「可以寫成」「」「。

在轉義字符前面加上轉義字符(「\」)。

用「」引用的字符串中的「'」不需要特殊處理,不需要加倍或轉義,同樣的,用「'」引用的字符串中的「」「不需要特殊處理。

因此,給定的字符串foo'bar可以寫在MySQL :

'foo''bar' 
'foo\'bar' 
"foo'bar" 

雖然上述地址的首要問題,use placeholders (aka prepared statements) - 查找每語言/適配器的正確方法。佔位符消除了需要報價(防止由定製邏輯引入的錯誤)​​可防止許多惡意SQL注入情況。


由MySQL選擇的語法從其他常見的SQL實現不同;這個語法不是通用的。