2010-06-23 32 views
1

我最近將一個存儲爲latin1_swedish_ci的舊MySQL數據庫轉換爲utf8_general_ci。現在我已經獲得了指定UTF-8(頁面上的HTML標記)的HTTP標頭,並且數據庫中的數據正確編碼爲utf8_general_ci。不同版本的PHP,Apache和MySQL之間的字符編碼問題

它在我的測試服務器上正常工作,因此我將更新的HTML文件和PHP腳本上載到活動服務器上的臨時區域。然後,我用測試數據庫中的導出來替換舊的臨時數據庫。

現在,在分段網站上有unicode實體,而不是每個撇號。

相同的數據庫,相同的代碼,但它不起作用。

測試服務器,並暫存區域之間的區別是,測試服務器如下:

測試:

  • 阿帕奇2.2.15
  • PHP 5.3.2
  • MySQL 5.1中

分期:(是的,這是可怕的過時,但它超出了我的控制)

  • 阿帕奇37年3月1日
  • PHP 5.2.3
  • 的MySQL 4.1.15

任何想法是什麼原因造成它不工作的臨時服務器上?

+0

您是如何執行從測試數據庫導出到臨時數據庫的導出的? mysqldump的? phpMyAdmin的? – Charles 2010-06-23 21:12:10

+0

'latin1_swedish_ci'和'utf8_general_ci'不是字符編碼,它們是排序規則 - 它們控制着在數據庫中如何排序。 ref:http://dev.mysql.com/doc/refman/5.5/en/charset.html – 2010-06-24 02:46:28

+0

@Charles:PHPMyAdmin – Macha 2010-06-24 06:16:11

回答

2

連接編碼在這裏非常重要。確保你在兩臺服務器上使用相同的編碼。例如,通過發佈此作爲第一個命令,當您連接:

SET NAMES 'utf8'; 
+0

這解決了它。我不得不將它添加到我的數據庫在PHP腳本中設置代碼。爲什麼在一臺服務器上這是必需的,而不是另一臺? – Macha 2010-06-24 16:45:23

+0

這兩個服務器可能有不同的默認編碼。在一臺服務器上,您自動獲得了正確的連接編碼,另一臺服務器上編碼錯誤。每次安全手動設置它總是最好的。 – 2010-06-28 10:39:19

0

確保設置每臺機器的my.cnf中你在運行MySQL如下:

[client] 
default-character-set=utf8 

...

[mysqld] 
default-character-set=utf8