原文地址:http://ilonng.blog.sohu.com/118488655.html 作者:ilonng
mysql 不同於其他數據庫(如oracle),它可以在多個級別設置字符集和校驗規則,如server級別、database級別、table級別和column級別。實際上,我們甚至還可以單獨對一串字符串設定其字符集和校驗規則,還可以在連接中設置其字符集和校驗規則,下面來簡單的討論下前4種級別的字符集和校驗規則的設置。
server
在啓動mysql服務的時候,可以指定mysql server的字符集和校驗規則,通過如下方式:
mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci
如果不親自指定它們,那麼mysql就會使用默認值。一般是latin1和latin1_swedish_ci。當然這個默認值是可以修改的,但是方法只有一種,那就是重編譯源代碼。採用如下方式:
./configure --with-charset=gbk --with-collation=gbk_bin
如何查詢當前的server的字符集和校驗規則的值,可以查看系統參數character_set_server和collation_server:
mysql> show variables like 'character_set_server%';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| character_set_server | latin1 |
+----------------------+--------+
1 row in set (0.00 sec)
mysql> show variables like 'collation_server%';
+------------------+-------------------+
| Variable_name | Value |
+------------------+-------------------+
| collation_server | latin1_swedish_ci |
+------------------+-------------------+
1 row in set (0.00 sec)
server的字符集和校驗規則的唯一作用就是,當database的字符集和校驗規則沒有指定的時候,就默認使用server的對應值。
database
我們在創建和修改數據庫的時候,可以指定其字符集和校驗規則:
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];
對應查看當前數據庫的字符集和校驗規則的系統參數是'character_set_database'和'collation_database',如下:
mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | gbk |
+------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'collation_database';
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| collation_database | gbk_bin |
+--------------------+---------+
1 row in set (0.00 sec)
mysql> show create database taobao;
+----------+--------------------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------------------+
| taobao | CREATE DATABASE `taobao` /*!40100 DEFAULT CHARACTER SET gbk COLLATE gbk_bin */ |
+----------+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
數據庫的字符集和校驗規則的作用有二,其一是當沒有在表級別知道它們,那麼默認就使用數據庫基本的值;其二是在“load data infile”時也起到了作用。
table
在創建表或者修改表結構的時候,我們可以通過如下方式指定這個表的字符集和校驗規則:
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]
可以使用show create table命令來查看某張表的字符集和校驗規則,eg:
mysql> show create table t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` varchar(100) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
column
具體的表的具體的某個字段,我們也可以指定其字符集和校驗規則,如下:
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name] [COLLATE collation_name]
可以使用show full columns命令來查看某個表的字段的校驗規則的設置,這樣就知道了它的字符集設置,eg:
mysql> show full columns from test\G
*************************** 1. row ***************************
Field: a
Type: char(111)
Collation: big5_chinese_ci
Null: YES
Key:
Default: NULL
Extra:
Privileges: select,insert,update,references
Comment:
*************************** 2. row ***************************
Field: b
Type: varchar(1000)
Collation: utf8_general_ci
Null: YES
Key:
Default: NULL
Extra:
Privileges: select,insert,update,references
Comment:
*************************** 3. row ***************************
Field: c
Type: varchar(20)
Collation: gbk_bin
Null: YES
Key:
Default: NULL
Extra:
Privileges: select,insert,update,references
Comment:
3 rows in set (0.02 sec)
那麼,這四個級別的字符集和校驗規則的指定(級別高低server>database>table>column),mysql最終以何種形式來存儲和顯示字符串的呢?
1、本級別中,如果同時指定character set和collate,那麼就使用指定的值;
2、本級別中,只指定character set而沒有指定collate,那麼就使用指定的character set值和其對應的默認的collation值;
3、本級別中,只指定collate而沒有指定character set,那麼就使用指定的collation值和其所對應的character set值;
4、本級別中,都沒有指定這2個值,那麼默認就使用上一級別的對應的值。