簡體   English   中英

PHP / MySQL中的編碼問題

[英]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
  • 如果直接在phpMyAdmin中運行查詢,則會得到結果。
  • 表編碼:UTF-8
  • HTML頁面編碼:UTF-8
  • 我可以添加記錄(從表單輸入中),其中名稱使用重音(例如“Fióre'sHäßelberg”)
  • 使用->“ name LIKE'$ labelName%'”時,我可以讀取帶有重音符號的記錄
  • 數據庫中的信息看起來不錯

我不知道為什么我不能選擇名稱帶有重音符的行。

我真的希望有人能幫助我。

更新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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM