之前我在一篇文章里面講到把故人居網(wǎng)站升級為UTF8字符集,看過的也知道一些有關(guān)PHP和MySQL字符集的問題,通常情況下MySQL默認使用的字符集是latin1,如果我們的系統(tǒng)要使用utf8或者別的字符集,就需要對MySQL進行配置,并且在PHP程序中做一點處理,大致的方法如下:
1.修改my.ini (或者my.cnf)文件,在文件的[mysqld]中加入下面一行
character_set_server = utf8
由于MySQL的字符集和連接校對有分級,分別是操作系統(tǒng)級、數(shù)據(jù)庫服務(wù)器級、數(shù)據(jù)庫客戶端級,這幾個級別是從上往下包含的,我上面的那一行 character_set_server 參數(shù)實際上就是設(shè)置了全局的字符集,這樣不管是MySQL數(shù)據(jù)存儲、數(shù)據(jù)連接、結(jié)果返回都將是utf8,當然,如果您愿意,您也可以進行分別的設(shè)置,比如做如下設(shè)置
default-character-set = utf8
default-collation = utf8_general_ci
這樣的設(shè)置可以設(shè)置一個默認字符集,在您的應(yīng)用中如果沒有特殊指定字符集,那將默認使用utf8作為字符集,并且使用utf8_general_ci作為連接校對的默認字符集;
簡單的處理方法就是如我前面的那樣,加入一行即可。
2.PHP程序中連接MySQL的時候,或者在執(zhí)行mysql_query的時候,執(zhí)行以下一行SQL語句
SET NAMES utf8
就是說在執(zhí)行mysql_query之前,或者在完成mysql_connect()之后,執(zhí)行 mysql_query(“SET NAMES utf8)
有了前面的兩個處理,您就可以正常的進行utf8字符集的數(shù)據(jù)庫操作,不管在頁面顯示還是數(shù)據(jù)庫中,字符都不會出現(xiàn)亂碼。
前面說到的方法是以前用到的常用方法,最近在MySQL的官方發(fā)現(xiàn)了這樣一個參數(shù) init_connect ,它的意思呢就是在MySQL啟動的時候,自動執(zhí)行init_connect 參數(shù)里面的SQL語句,支持用分號間隔的多個語句,于是我們可以把 SET NAMES utf8語句加到my.ini文件里面,在PHP程序里面就不用單獨處理了,加入?yún)?shù)的方法很簡單,就是在my.ini文件的 [mysqld] 段加入下面一行
init_connect = ‘SET NAMES utf8′
不過這個方法有一個需要注意的地方,那就是該參數(shù)對于連接數(shù)據(jù)庫的用戶是超級用戶組的用戶將被忽略,那么在PHP程序中用來連接MySQL數(shù)據(jù)庫的用戶不能是SUPER組的用戶,比如root用戶就肯定不行,這樣是為了避免該參數(shù)導(dǎo)致數(shù)據(jù)庫致命錯誤,而無法使用任何一個用戶連接上修改該項配置,之前我搞了兩天都沒有發(fā)現(xiàn)這樣的問題,害我郁悶了很久。。。
有關(guān)MySQL的配置文件中用到的參數(shù)可以參考官方的文檔 : http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html