2011年1月18日 星期二

mysql 的中文問題

在mysql 裏使用中文,會遇到一些問題,使的我們所看到的,或是備份出來的資料出現亂碼。
問題解決的方式不難,但是環環相扣,少了一個都不行。
首先,是mysql資料表本身編碼的問題,預設的編碼是 latin1 ,使用單一個位元來儲存資料;但是中文環境不論是big5 或是 utf8 都是使用2個位元的,所以一但選錯,就算在網頁上是正常顯示的,在 mysql client 和 phpmyadmin 上看到的中文資料都是亂碼。
要解決這個問題,可以在建立資料表的sql指令最後,加入以下敘述 TYPE=MyISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;
這樣可以令資料表採用 utf8 編碼,並使用 utf8_unicode_ci 做連線校對。
第二、就是我們在php存取資料時,所用的sql 指令。在預設的情況裏,他還是使用 latin1 的編碼方式來對 mysql 做操作,所以我們得告訴系統,我們要用 utf8 來做操作,以 xoops 這個系統為例,方法如下:
找到 /class/database/mysqldatabase.php 這個檔,在 connect 這個方法中,加入以下指令
@mysql_query(”SET NAMES utf8″, $this->conn);
重點是 “SET NAMES utf8″,這會告訴 mysql 我要用 utf8 的方法來操作資料庫。
這樣一來,在  phpmyadmin 就會看到正常的中文。
如果你沒用到 shell 的話,問題就到此為止,但是你如果在 shell 有用到 mysqldump 來備份資料的話,還有一個問題。
第三、vi的編碼問題,vi預設的編碼不是utf8 所以我們要設定一下 .vimrc ,告訴他要我要用 utf8 來做預設的編碼。在此附上我的設定檔給大家參考:
set enc=utf-8
set fenc=utf-8
set fencs=utf-8,big5
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4
set autoindent

沒有留言: