首先給出了字符集和校驗的概念,這對理解後文很重要。》》查閱手冊
可以使用
mysql> SHOW CHARACTER SET;
對字符集進行查看,種類繁多。
可以使用
mysql> SHOW COLLATION LIKE 'latin1%';
對latin1字符集校驗進行查看,種類同樣很多,都以$1_$2_$3的形式出現,$1爲使用的字符集,$2爲使用國家,也可能是多國語言general,$3
一般設置爲ci,cs,bin。ci是不區分大小寫的,cs是大小寫敏感的,bin是二原結束
設置字符集和校驗分爲客戶端和服務器端
服務器端的字符集和校驗可分爲四層,高層服務器字符集和校驗,次高層數據庫字符集和校驗,低層表字符集和校驗,最低層列字符集和校驗
。分別以1,2,3,4代表。
1是在安裝時設置好的,如果默認要改變要重新安裝,但在啓動mysqld的時候可以設置
shell> mysqld --default-character-set=latin1 /
--default-collation=latin1_swedish_ci
同時設置character_set_server和collation_server系統變量的值爲上面定義的
2可以在創建時定義,也可以在以後設置
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
CREATE DATABASE db_name
DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
設置character_set_database和collation_database變量的值,如果缺省看看手冊就懂了,很簡單。下面介紹的也一樣
3同上
CREATE TABLE tbl_name (column_list)
[DEFAULT CHARACTER SET charset_name
[COLLATE collation_name]]
ALTER TABLE tbl_name
[DEFAULT CHARACTER SET charset_name]
[COLLATE collation_name]
4同上
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name [COLLATE collation_name]]
CREATE TABLE Table1
(
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);
客戶端的連接同樣要設置字符集和校驗,服務器需要知道,你使用的是什麼字符集,服務器接到數據後要轉換成什麼字符集和返回什麼字符集
,如果需要改變可能會丟失字節。服務器使用character_set_client變量作爲客戶端發送的查詢中使用的字符集。服務器使用
character_set_connection和collation_connection系統變量進行轉換.character_set_results變量指示服務器返回查詢結果到客戶端使用的
字符集。
可以如下設置客戶端字符集
SET NAMES 'charset_name'
SET NAMES 'x'語句與這三個語句等價:
mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x;(這就是爲啥PHP要設置字符集的原因啦)
一直設置很煩啦,可以在my.ini裏設置
[mysql]
default-character-set=utf8
手冊上還介紹了在查詢時顯示的設置字符集和校驗character_set_connection 和collation_connection的方法不太常用,提一下,詳細看手冊吧
SELECT _latin1'string' COLLATE latin1_danish_ci;
這是改變校驗的
SELECT K FROM t1 ORDER BY k COLLATE latin1_german2_ci;
mysql提供了字符集轉換的函數CONVERT(),CAST()
CONVERT(expr USING transcoding_name)
SELECT CONVERT(latin1field USING utf8) FROM latin1table;
CAST(character_string AS character_data_type CHARACTER SET charset_name)
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
也爲SHOW提供了查看數據庫,表和列的字符集
mysql> SHOW CREATE DATABASE databasename;
mysql> SHOW CREATE TABLE tablename;
mysql> SHOW FULL COLUMNS FORM columnsname/G;/G看的比較清楚,列不多可以不加啦
上面提供了很多變量可以用SHOW查看
mysql> SHOW VARIABLES LIKE 'character_set_client';
mysql> SHOW VARIABLES LIKE 'character_set_system';這句是查看mysql返回信息的字符集,默認是utf8的
MYSQL 5.1新特性:mysql分配了一直國際特有字符集,其實就是utf8啦,utf8現在是4字節變長,但在mysql他是3字節存的,所有如果用了
char(10)就表示要分配30個字節,因爲這是最大長度嘛。varchar是變長所以用的字節就少,但有人說char速度快。
新特性就是下面類型聲明是等價的:
CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)
下面同樣:
VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)
比較方便啦