2015-10-14 77 views
0

我將使用PhP表示法來使變量變得簡單。MYSQL命令和編碼

假設數據庫是UTF-8,客戶端設置爲UTF-8。

有兩方面的問題。知道,對於'(報價)的ASCII碼是39十進制:

客戶端 當查詢變量$標題,逃脫的使用功能,如real_escape_string(),將功能逃避所有字節表示分別有39個值?還是會看到值39的字節是否是UTF-8符號的一部分?

服務器端

SELECT * from STORIES WHERE title = 'Hello' 

是什麼MYSQL假設查詢編碼是什麼?這包括部分:

SELECT * from STORIES WHERE title = ' 

然後如果$ filteredTitle恰好有39個字節中它是一個UTF-8符號的一部分,請問MYSQL知道這是不是一個報價?

+0

恕我直言,太多擔心什麼。你真的嘗試過:'「從STORIES WHERE標題='」選擇*。「.mysql_real_escape_string($ title)。」'「'? – Alex

+0

我想了解它是如何工作的。你提到的查詢有什麼問題? – Makketronix

+0

如果你想了解mysql是開源的,你可以閱讀所有的源代碼。爲什麼它一定是錯誤的查詢字符串我建議? – Alex

回答

0

讓我們看看兩個問題。

  1. 當提供SELECT語句時,字符串必須「轉義」。否則,引號內會出現語法問題。特別是',"\必須在前面加一個反斜線以避免混淆。 mysqli_real_escape_string()提供該功能。 (請勿使用mysql_real_escape_string(),它屬於已棄用的mysql_* API。)當您使用SELECT字符串時,不需要「解除轉義」。

  2. ascii撇號(十進制39,十六進制27,有時也稱爲「單引號」)通常用於許多編程語言中用於引用字符串。一長串的utf8「引號」可以找到here

+0

命令如下:「SELECT * FROM sometable」總是純粹的ASCII,但是命令「SELECT somecolumn FROM sometable where somecolumn ='someEncodedString'」;將只處理編碼的'someEncodedString'? – Makketronix

+0

當你使用PHP或其他語言,你需要說一些像'$ sql =「SELECT ... WHERE c ='string'」;'如果「字符串」有任何引號,它們必須被轉義,否則PHP (等)會抱怨。轉義通過字符串內的字符串語法問題。 –