MySQL(4.1以后版本) 服務(wù)器中有六個(gè)關(guān)鍵位置使用了字符集的概念,他們是:client 、connection、database、results、server 、system.MySQL有兩個(gè)字符集概念:一個(gè)就是字符集本身,一個(gè)是字符集校驗(yàn)規(guī)則.字符集影響數(shù)據(jù)在傳輸和存儲(chǔ)過程中的處理方式,而字符集校驗(yàn)則影響ORDER BY和GROUP BY這些排序方式.
1.和存儲(chǔ)有關(guān)的
服務(wù)器字符集 (@@character_set_server)
庫字符集 (@@character_set_database)
表字符集
字段字符集
character_set_server: 服務(wù)器安裝時(shí)指定的默認(rèn)字符集設(shè)定.
character_set_database: 數(shù)據(jù)庫服務(wù)器中某個(gè)庫使用的字符集設(shè)定,如果建庫時(shí)沒有指明,將使用服務(wù)器安裝時(shí)指定的字符集設(shè)置.
character_system: 數(shù)據(jù)庫系統(tǒng)使用的字符集設(shè)定.
在創(chuàng)建一個(gè)表的時(shí)候,每個(gè)字段只要不是binary,都會(huì)有一個(gè)字符集.如果不指定,那么在SHOW CREATE TABLE的時(shí)候,它是不會(huì)顯示出來的.
建表時(shí)候,字段字符集的選取方式如下:
* if 字段指定的字符集
* else if 表指定的字符集
* else if @@character_set_database
* else @@character_set_server (如果沒有設(shè)定,這個(gè)值為latin1)
2.和傳輸有關(guān)的
@@character_set_connection
@@character_set_results
@@character_set_client
character_set_connection: 連接數(shù)據(jù)庫的字符集設(shè)置類型,如果php沒有指明連接數(shù)據(jù)庫使用的字符集類型就按照服務(wù)器端默認(rèn)的字符設(shè)置
character_set_results: 數(shù)據(jù)庫給客戶端返回時(shí)使用的字符集設(shè)定,如果沒有指明,使用服務(wù)器默認(rèn)的字符集
character_set_client: 客戶端使用的字符集,相當(dāng)于網(wǎng)頁中的字符集設(shè)置
3.字符集的校對(duì)規(guī)則
字符集的校對(duì)規(guī)則設(shè)定分別由上面的character_set_connection, character_set_database, character_set_server決定
collation_connection: 連接字符集的校對(duì)規(guī)則
collation_database: 默認(rèn)數(shù)據(jù)庫使用的校對(duì)規(guī)則.當(dāng)默認(rèn)數(shù)據(jù)庫改變時(shí)服務(wù)器則設(shè)置該變量.如果沒有默認(rèn)數(shù)據(jù)庫,變量的值同collation_server
collation_server: 服務(wù)器的默認(rèn)校對(duì)規(guī)則
以上內(nèi)容中character_set_client,character_set_connection,character_set_results受客戶端默認(rèn)字符集影響,其中php編譯mysql模塊時(shí)的默認(rèn)字符集同樣也受到它鏈接的mysql動(dòng)態(tài)庫影響,從而影響到php的character_set_connection, character_set_client設(shè)定.當(dāng)默認(rèn)字符集不是utf8時(shí),設(shè)置my.cnf
[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
default-character-set只能改變對(duì)存儲(chǔ)層(server,database,table,column,system)的設(shè)定,對(duì)于客戶端和服務(wù)器端的通訊層沒有任何影響.
mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————————————————————+
| Variable_name| Value|
+————————–+—————————————————————————+
| character_set_client| latin1|
| character_set_connection | latin1|
| character_set_database| utf8|
| character_set_filesystem | binary|
| character_set_results| latin1|
| character_set_server| utf8|
| character_set_system| utf8
解決字符集通訊設(shè)置不匹配的方法:
(修改默認(rèn)的character_set_client,character_set_connection,character_set_result)
1. 重新編譯mysql和php,mysql加入編譯參數(shù) –default-character-set=utf8
2.PHP程序在查詢數(shù)據(jù)庫之前,執(zhí)行mysql_query(”set names utf8;”);
3.修改my.cnf,在[mysqld]中加入init-connect=”set names utf8” (對(duì)于超級(jí)用戶連接該選項(xiàng)無效)
4. 啟動(dòng)mysqld 加入?yún)?shù) –skip-character-set-client-handshake忽略客戶端字符集