2011-01-06 123 views
0

我有一個包含utf8_general_ci varchar字段的InnoDB表的MySQL數據庫。當我通過PHP(通過PEAR :: MDB2)獲取它們並嘗試輸出它們(通過Smarty)時,我得到了?符號。我想知道如何解決這個問題,這很可能是由PHP引起的。字符編碼問題:MySQL 5.0 + PHP 5.2

良好的信息知道:

  • 據該網站的新版本,我的工作,老版本有,即使它並沒有使用Smarty的,也不MDB2同樣的問題,所以他們是最有可能不是原因。舊程序員使用htmlentities()來解決問題,但我試圖避免這種情況。
  • 我所有文件(模板,源代碼等)的字符編碼都是UTF-8,沒有BOM。
  • 當我顯示一個頁面時,所有重音字符(模板中的那些字符,而不是來自MySQL的)會正確顯示,並且瀏覽器中的編碼爲UTF-8。如果我手動將其切換到ISO-8859-1,那麼MySQL中的字符正確輸出,但沒有其他字符。

基本上,似乎PHP或MySQL在查詢/獲取過程中的某個點將數據庫中包含的UTF-8數據轉換爲ISO-8859-1,這就是我想要解決的問題。

我已經做了很多搜索,但沒有找到任何解決方案,我希望問題出在某個地方。我想避免使用htmlentities()或utf8_encode(),但這可能是PHP6出現之前唯一的方法。

謝謝你對此的意見!

+0

這些是如何來看?直行 ?標記或?在黑色鑽石? – 2011-01-06 15:44:51

回答

1

您需要執行一些查詢來告訴它使用UTF-8進行連接(默認值爲Latin-1)。下面是我用:

SET CHARACTER SET = "utf8"; 
SET character_set_database = "utf8"; 
SET character_set_connection = "utf8"; 
SET character_set_server = "utf8"; 

我知道有一些這些似乎矯枉過正,但他們已經過測試,似乎工作得很好......

+0

「我不知道這個神奇的咒語是什麼意思,但是當我吟唱它時,它總是會在我的莊稼上下雨」。非常聰明 – 2011-01-06 15:41:07

0

我的猜測是當數據到達數據庫時數據不是utf-8編碼的。