[英]Encoding problems in PHP / MySQL
編輯:從我的原始帖子的反饋后,我已更改文本以澄清我的問題。
我有以下查詢(偽代碼):
$conn = mysql_connect('localhost', 'mysql_user', 'mysql_password');
mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';");
mysql_query("SELECT id FROM myTable WHERE name = 'Fióre`s måløye'", $conn);
這將返回0行。
在我的日志文件中,我看到以下內容:
255 Connect root@localhost on
255 Query SET NAMES 'utf8'; COLLATE='utf8_danish_ci'
255 Init DB norwegianfashion
255 Query SELECT id FROM myTable WHERE name = 'Fióre`s måløye'
255 Quit
我不知道為什么我不能選擇名稱帶有重音符的行。
我真的希望有人能幫助我。
更新1:我已經妥協了。 在存儲數據時,我將使用htmlentities來轉換重音符號,在從數據庫中檢索數據時,將使用html_entity_decode來轉換重音符號。 這似乎有效。
到目前為止,我看到的唯一缺點是,我無法使用phpMySQL以明文形式讀取名稱。
我認為您應該返回$result
不是$this->query
。
另外,您應該了解SQL注入,並考慮使用mysql_real_escape_string
或Prepared Statements保護您免受此類攻擊。 addslashes
不是適當的保護。
試試這個查詢。 如果獲得結果,則查詢中的反引號字符會出現問題
SELECT * FROM sl_label WHERE name Like 'Church%'
正如其他答案所表明的那樣,這似乎很像一個編碼問題。 我建議打開查詢日志記錄( http://dev.mysql.com/doc/refman/5.1/en/query-log.html ),因為它可以顯示數據庫真正收到的內容。
更新 :我終於找到了一個頁面,解釋PHP和UTF-8的骯臟細節( http://www.phpwact.org/php/i18n/charsets )。 另外,請確保閱讀此內容( http://niwo.mnsys.org/saved/~flavell/charset/form-i18n.html ),以了解如何獲取來自表單帖子的正確數據。
也許可以在調用查詢后嘗試檢查錯誤消息(如果您尚未在該函數之外執行此操作)。 可能是在告訴您到底出了什么問題。
正如Artem所說,打印出實際的查詢是一個好主意-有時情況與您期望的不完全相同。
這可能是一個編碼問題,“教堂”中的“”可能是一個花哨的字符。 PHPMyAdmin可以是UTF-8,而您自己的PHP網站可以是iso-latin1。
我在看這條線
mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';");
我認為這可能是一個錯誤。 用';' 您正在向服務器發送兩個查詢,但是COLLATE是一個子句,而不是獨立的法律聲明。 嘗試:
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_danish_ci'");
如果服務器不接受COLLATE子句,則可能是您的標簽列具有danish_ci排序規則的問題,但是進入的語句具有默認值(prob utf_general_ci)。 重音字符將不匹配,但是通配符有效,因為基本ascii字符的表示形式是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.