一、如何正確設定MySQL語系
MySQL 4.x版之後許多php程式大都預設為UTF8語系,但是在Linux上用rpm,
Windows上用appserv方式安裝mysql時,通常會以的「latin1」方式來安裝
為了讓相關資料庫中中文碼可以正常顯示,現在大都採用「UTF8」來作為中文語系
但是只有 client 跟 server 的 character-set 都設定成一樣的時候才會正常,不然會有問題!!
MySQL server端語系修改:
加上「default-character-set=utf8」
Windows(以appserv安裝),修改C:\AppServ\MySQL\my.ini中
p28.png
Linux(以rpm安裝),修改/etc/my.cnf中
p29.png

二、如何讓php與mysql順利合作
前面說過只有client 跟 server 的 character-set 都設定成一樣的時候才會正常,所以mysql採用「utf8」
許多新的php程式就可以正常且順利的使用,最常見的就phpMyAdmin(2.6.x以後就是用utf8來編寫php)
正常於網頁上輸入中文,但是卻無法顯示!!
p30.png
p31.png
為了讓utf8語系的phpMyAdmin可以正常輸入、查詢中文,請依上面修改語系
如果修改正確的話,透過「系統變數」查詢
p13.png
會發現mysql語系是「utf8」
p32.png
再確認mysql中資料表(table)也是「utf8-utf8_general_ci」
p33.png
如果都確認無誤的話,再次輸入中文將會正常顯示!!
p34.png

三、如何讓現有不同語系的資料庫轉成「utf8」
把資料庫的資料編碼轉成 utf8
1.把資料庫 dump 出來
mysqldump -u xxx -p database > database.sql --default-character-set=latin1
這時候 dump 出來的 database.sql 是 latin1 的檔案格式,
然而是 utf8 的文字資料,因此這時若用 vi 開檔看它
還是會發現中文字是鬼畫符,這時不要被眼前的假象所騙,
以為自己做錯 .. 幾接著做下一步驟。
2.把 dump 出來的 database.sql用文字編輯器來編輯
下載回去試著用一般的文字編輯器(小弟個人是用editplus)
把 database.sql 打開,它可以正常識別 utf8 的文字
用取代的功能,把 latin1 都取代成 utf8 ,之後直接另存新檔
這時把檔案類型設定儲存成 UTF-8。
3.再把 database-utf8.sql 回傳到 server上
這時我們用 vi 開啟它 就可以看見是正常的中文字
這就表示檔案沒問題囉。
4.把檔案匯入資料庫
mysql database < database-utf8.sql -u xxx -p --default-character-set=utf8
如果資料量不是很大,那麼很快就可以完成這個步驟,這時候若沒有錯誤訊息出現,那麼恭喜你。
5.此時再用新的phpmyadmin(新舊版本應該都可以正常查詢)進去看,應該可以正常查閱並寫入!!

四、如何讓前端php用「big5」後端用MySQL用「utf8」
前面說過只有client 跟 server 的 charset 都設定成一樣的時候才會正常,但是mysql採用「utf8」
可以正常且順利的解決中文字中許多亂碼的問題,但是目前還有許多程式還是用「big5」來編寫的,
現在的sfs3也還是用「big5」來編寫php程式,那是否能夠將資料庫轉成「utf8」,但是前端的php仍是
採用「big5」,是可行的,只要在php的程式中加上如下的sql語法,則原來的php程式正常執行了!!
下面sql語法中所輸入的語系是指php的語系,並非mysql的語系,請注意!!
$char_1 = "SET NAMES big5;";
$char_2 = "SET CHARACTER_SET_CLIENT=big5;";
$char_3 = "SET CHARACTER_SET_RESULTS=big5;";
mysql_query($char_1);
mysql_query($char_2);
mysql_query($char_3);
p35.png

五、如果希望將php程式改為「utf8」
1.用 nano /etc/httpd/conf/httpd.conf 設定Apache中的語系為 (記得restart)
AddDefaultCharset UTF-8
2.用 nano /etc/php.ini 設定php中的語系為 (記得restart)
default_charset = "utf-8"
3.用 nano /etc/my.cnf 設定MySQL中的語系為 (記得restart)
[mysqld]
init_connect='SET NAMES utf8'
default-character-set=utf8
[client]
default-character-set = utf8
4. 建立資料庫時選擇語系: (記得清除DB Cache)
DROP DATABASE IF EXISTS `aa`;
CREATE DATABASE `aa` DEFAULT CHARACTER SET utf8 COLLATE
utf8_unicode_ci;
USE `aa`;
CREATE TABLE IF NOT EXISTS `aat` (
`id` char(1) NOT NULL default '1',
`myStr` varchar(200) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
5. 用UltraEdit(v11.20a版) 轉換所有ANSI格式的php檔案轉化為UTF-8格式:
File --> Conversions --> ASCII to UTF-8 (Unicoding Editing)
( 在UltraEdit中按Advanced --> configuration --> File Handling
--> Unicode/UTF-8 Detection --> 剔選Auto detect utf-8 files )
6. 在php檔中必須加入:
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
7. 在連接DB的檔中必須加入3行mysql_query才ok:
$char_1 = "SET NAMES utf8;";
$char_2 = "SET CHARACTER_SET_CLIENT=utf8;";
$char_3 = "SET CHARACTER_SET_RESULTS=utf8;";
mysql_query($char_1);
mysql_query($char_2);
mysql_query($char_3);
8. 在php檔中, 如有需要須注意: [Optional]
運用htmlentities和htmlspecialchars時,要似如下:
$chars = htmlentities($chars,ENT_QUOTES,"UTF-8");
$chars = htmlspecialchars($chars,ENT_QUOTES,"UTF-8");
並且在顯示前要用
$chars = html_entity_decode($chars,ENT_QUOTES,"UTF8");
如有用過addslashes()或mysql_real_escape_string()記得用以下:
$chars = stripslashes($chars);
如有需要可以用以下function將不同編碼轉換:
$chars = iconv('Big5','UTF-8',$chars); //由Big5轉為UTF-8
Last modified: Tuesday, 6 September 2011, 7:54 PM