從MySQL 4.1開始引入的多語言支援確實很棒,而且一些功能已經超過了其他的資料庫系統。不過我在測試過程中發現使用適用於MySQL 4.1之前的PHP語句操作MySQL資料庫會造成亂碼,即使設定過了表字符集也是如此。
MySQL 4.1的字元集支援(Character Set Support)有兩個面向:字元集(Character set)和排序方式(Collation)。對於字元集的支援細化到四個層次: 伺服器(server),資料庫(database),資料表(table)和連線(connection)。
查看系統的字元集和排序方式的設定可以透過下面的兩個指令:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+-------------- ------------+----------------------------+
| Variable_name | Value |
+--------------------------+--------------------- -------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1
| character_set_ultults |
| character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ |+--------------------------+----- -----------------------+7 rows in set (0.00 sec)mysql> SHOW VARIABLES LIKE 'collation_%';+- ---------------------+-------------------+| Variable_name | Value |+----------------------+-------------------+| collation_connection | latin1_swedish_ci || collation_database | latin1_swedish_ci || collation_server | latin1_swedish_ci |+----------------------+-------- -----------+3 rows in set (0.00 sec) 上面所列的值就是系統的預設值。 (很奇怪系統怎麼預設是latin1的瑞典語排序方式。) 當我們按照原來的方式透過PHP訪問MySQL資料庫時,就算設定了表的預設字元集為utf8並且透過UTF-8編碼發送查詢,你會發現存入資料庫的仍然是亂碼。問題就出在這個connection連接層。解決方法是在發送查詢前執行一下下面這句:SET NAMES 'utf8'; 它相當於下面的三句指令:SET character_set_client = utf8 = s = utf8; 再試試看,就正常了。 以上就是解決php存取mysql 4.1亂碼問題的內容,更多相關內容請關注PHP中文網(www.php.cn)!