原文地址: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: tCreate Table: CREATE TABLE `t` ( `a` varchar(100) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf81 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个值,那么默认就使用上一级别的对应的值。