Linux0911 2006-1-22 05:21 AM
解決 PHP 存取 MySQL 4.1 亂碼問題
[url]http://www.enhand.net/blog.php?id=83[/url]
【簡介】
從 MySQL 4.1 開始引入的多語言支援確實很棒,而且一些特性已經超過了其他的資料庫系統。不過我在測試過程中發現使用適用於 MySQL 4.1 之前的 PHP 語句操作 MySQL 資料庫會造成亂碼,即使是設置過了表字元集也是如此。我讀了一下新的 MySQL 在線手冊中第十章"Character Set Support"後終於找到了解決方法並測試通過。
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_results | latin1 |
| character_set_server | latin1 |
| 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;
SET character_set_results = utf8;
SET character_set_connection = utf8;
再試試看,正常了吧?^_^ Enjoy!
評論122:先更改資料庫編碼
評論人:遊客 時間:2005-12-22 E-MAIL [email]GcxxQvW@xx.no[/email]
先更改數據庫編碼
ALTER DATABASE `數據庫名字` DEFALUT CHARACTER SET big5 COLLATE big5_chinese_ci;
然後在數據庫連接:
$db=@mysql_connect('localhost','root','') or die ('連接失敗');
上面這句後面加一句:
mysql_query('set names big5');
就可以了,哈