分別在服務器、數據庫、表和列級別設置mysql字符集和校驗規則

原文地址: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個值,那麼默認就使用上一級別的對應的值。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章