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