2011-09-10 51 views
7

爲了使網站接受用戶提交的內容(可能不是英文)(例如日文)並將其保存到數據庫,utf8_encode所有新內容和用戶utf8_decode稍後檢索時?國際化使用utf8_encode()(PHP函數)的內容最佳實踐

進一步信息: 我使用學說,並試圖Unicode字符保存或選擇到MySQL數據庫的時候,我得到一個錯誤:

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

+0

請將您的表格架構包含在此中。並可能提供完整的SQL? < - 提示(比較問題) – ajreal

+0

需要更多信息:您的表使用什麼排序規則? –

+0

[UTF-8一路通過]的可能重複(http://stackoverflow.com/questions/279170/utf-8-all-the-way-through) – mercator

回答

8

你並不需要使用編碼功能。你需要做的是確保你是UTF8端到端。看起來你的數據庫可能正在使用latin1編碼和整理。您與數據庫的連接也需要是UTF8。有時候,這只是在建立連接後立即執行SET NAMES UTF8查詢的問題。

在mysql中運行此命令可能會解決您在上面看到的錯誤,但仍需要端到端的UTF8。那麼你不需要對你的數據做任何特別的事情。

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
5

布倫特是對的。它需要是端到端的。以下是我的清單:

Apache config: 
    AddDefaultCharset UTF-8 
    AddCharset UTF-8 .utf8 

php.ini: 
    default_charset = "utf-8" 

MySQL: 
    ALTER DATABASE DEFAULT CHARACTER SET utf8; 
    ALTER TABLE SomeTableName DEFAULT CHARACTER SET utf8; 

PHP/HTML: 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    … 
    <form … <input type="text" name="some_field" value="<?php echo htmlspecialchars($row['some_field'], ENT_COMPAT, 'UTF-8'); ?>"… 

This last one seems the most important. Call this function immediately after the mysql_connect() call: 
    mysql_query("SET NAMES 'utf8'");