php 和 MySQL 4.1的問題

在phpmyadmin下看到的中文字亂碼的解決方法

取自:http://freesf.tnc.edu.tw/modules/newbb/viewtopic.php?topic_id=3739&forum=23&viewmode=flat&order=ASC&start=0

darkhero:
以下提供兩種做法:
1 若你的資料庫Server只有你一個人在用,只用到一種編碼資料庫.例如big5...
則可以直接在 my.cnf 中的 mysqld 區段設定 資料庫預設語系為 big5...
然後 mysql client 部份也設定一個 init_command 去預設每個 client 的編碼為big5
相關資料可以參考這篇.
http://blog.dragon2.net/archives/2005/08/08/194.php


2. 若是你的資料庫Server不一定只有 big5 的資料..
建議你 mysql Server 部份預設為 utf8 , 然後每個 client在連線完成的時候(也就是每個php程式完成 mysql_connect 後),執行一下 mysql_query("set names big5"); 或是你需要的編碼 像是 mysql_query("set names utf8");mysql_query("set names gb2312")等...
這樣mysql會自動幫你把client的 big5 資料傳到 server 的時候會轉成為 資料庫的編碼格式...

至於你用 兩個都是latin1 也是可以阿...這樣的情況只是client 跟 server之間不做任何轉碼的動作.

只是phpmyadmin 2.6.x後預設以 utf8 顯示資料...
所以會跑 set names utf8 ...如此一來...你的資料在在phpMyAdmin中就會被錯誤的重新解碼....因此就會有亂碼出現....


jrh:
1.在mysql_connect()之後mysql_query("set names big5");
『big5』,可改成您要存入資料庫的資料的編碼方式,也就是現在起您寫php時在做完連線資料庫之後,還要再指定您要寫入的資料的編碼方式!

2.建立一個資料庫時別忘了指定該資料庫的編碼方式(以下以big5為例),如下:
CREATE DATABASE `aaa` DEFAULT CHARACTER SET big5 COLLATE big5_chinese_ci;

若您是使用phpmyadmin幫您建立資料庫,別忘了校對請選『big5_chinese_ci』。

這樣一來phpmyadmin上看中文就不會出現亂碼了!


darkhero:
簡單的解釋一下為什麼你的需要在client 跟 server 都是 latin1_general_ci 的情況下才會正常..

當初資料進入資料庫的時候 database 的設定是 latin1_general_ci , client 也是 latin1_general_ci...資料內容是 utf8 .
所以 data = > mysql_client = > mysql _server = > >Database.
最後以 latin1_general_ci 的處理方式,存入了utf8 的資料.

所以你要用 latin1 的 clent + latin1 的 database server 才能反向這個流程...
將已經被 latin1 處理的 utf8 內容取出...

若是這時候.你用 phpMyAdmin 去改了資料庫編碼 latin1_general_ci = > big5_chinese_ci 的話, 資料內容會被資料庫Server進行 latin1_general_ci = > big5_chinese_ci 的處理......
這時候你就算用 big5_chinese_ci 的去取得資料庫的資料,得到的也只是 經過 latin1 + big5 兩到處理的資料..所以是亂碼!~...

正確的處理方式應該是會經過下列步驟:
mysqldump --default-character-set=latin1 --compatible=mysql40 mydatabase > mydatabase.sql
因為你的資料內容部份是utf8 所以..
mysql --default-character-set=utf8 mydatabase2 < mydatabase.sql

當然.這只是基本步驟.若是發生問題則需要視情況處理,例如欄位名稱用了保留字等問題...


mysql4.1在phpmyadmin下看到的中文字亂碼的解決方法
目前僅在ununtu5.10測過(php5.05、mysql4.1.12、phpMyAdmin 2.6.4-pl1),其他平台請有需要的人測試,我想應該沒問題吧!因為這只是phpmyadmin的問題而已。

解決方法一、
不要裝phpmyadmin2.6以後的版本,改裝phpmyadmin2.5.7
只不過用舊一些的版本,心理不太舒服!

解決方法二、
我是用phpmyadmin2.6.4,不過有兩個地方要修改:

1.
在phpmyadmin/libaries/select_lang.lib.php
第171行,將'zhtw-big5' => array('zh[-_](tw|hk)|chinese traditional',
'chinese_traditional-big5', 'zh-TW') 註解掉,在其下加入 'twbig5-utf-8'
=> array('zh[-_](tw|hk)|chinese traditional',
'chinese_traditional-big5', 'zh-TW'),
主要就是把zhtw-big5改成twbig5-utf-8,因為phpmyadmin2.6遇到mysql4.1沒有看到utf-8就不理你,所以只好騙他嘍!


2.
在phpmyadmin/libaries/select_lang.lib.php
第240行,將'big5' => 'big5', 註解掉,在其下加入'big5' => 'latin1',
也就是將big5對應到latin1的意思!
第257行,將'utf-8' => 'utf-8', 註解掉,在其下加入'utf-8' => 'latin1',
也就是將itf-8對應到latin1的意思!

如下:

// MySQL charsets map
$mysql_charset_map = array(
//'big5' => 'big5',
'big5' => 'latin1',
'cp-866' => 'cp866',
....
....

//'utf-8' => 'utf8',/
'utf-8' => 'latin1',
創作者介紹
創作者 ketelle_w 的頭像
ketelle_w

ketelle_w的部落格

ketelle_w 發表在 痞客邦 留言(0) 人氣()