mysql字符集设定分了四级,它们依次为服务器级,数据库级,表级,列级,只要有需要,这些字符集可以任意指定。
当然,mysql字符集四级设定存在一个继承关系,即在不指定字符集的情况下,数据库字符集将继承服务器的,而表将继承数据库的,列将继承表的。
举例来说,初始指定的服务器字符集为gbk, 那么在创建数据库时,如果不为该数据库指定字符集,那么数据库创建后,该数据库的字符集就是gbk(服务器字符集);同样的,在该数据库下创建表时,如果不为表指定字符集,则表的字符集就为gbk(数据库字符集);这以规则同样适用于列,若不指定则列的字符集为表的字符集。
以上四级字符集存在一个继承关系,并特别强调是不在特别指定的情况下发生,鉴于此,那么在特别指定的情况下会使怎么样的呢? mysql的优先级关系,从高到底一次为列级,表级,数据库级,服务器级。
举例来说:如果初始指定的服务器字符集为gbk,那么在创建数据库时,若指定字符集为gb2312,那么该数据库的字符集就是gb2312;同样,若在该库下创建表时,指定的表的字符集是utf8,那么表的字符集就是utf8,在创建表时若指定的列的字符集是latin1,那么列的字符集就是latin1。
mysql 服务器(server字符集设置方法)
在/etc/init.d/文件下有mysql的启动脚本,通过启动脚本中有下面一下话,就是如果想要影响MySQL变量,你应该创建,更改/etc下的my.conf文件,或者其他的MySQl的配置文件。
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
看mysql的启动脚本可以清楚的知道很多细节的知识(加深shell脚本的学习的必要性),没有细读mysql的脚本,所有在此不做过多说明。
下面是在配置文件里更改mysql服务器的字符集,修改方法如下:my.cnf文件中
[mysqld]
#set the default character set.
character-set-server=gbk
设置数据库的字符集为gbk;
使用 service mysql restart重启myql服务器,连接mysql服务器,查看服务器的字符集设置为:
可以看到character_set_server和character_set_database的字符集变成了gbk,关于character_set_database也变成了gbk,这一点可以自行查阅去了解细节。
二、 MySQL 数据库(database)字符集设置方法:
1. 继承性,在不指定字符集(上面创建服务器字符集为gbk),在创建数据库的字符集应该默认是gbk
mysql> create database db_test10;
Query OK, 1 row affected (0.00 sec)
mysql> show create database db_test10;
+-----------+-------------------------------------------------------------------+
| Database | Create Database |
+-----------+-------------------------------------------------------------------+
| db_test10 | CREATE DATABASE `db_test10` /*!40100 DEFAULT CHARACTER SET gbk */ |
+-----------+-------------------------------------------------------------------+
可以看出数据库db_test10的字符集是gbk。
2. 在创建数据库时,特意指定字符集
mysql> create database db_test11 default character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql> show create database db_test11;
+-----------+--------------------------------------------------------------------+
| Database | Create Database |
+-----------+--------------------------------------------------------------------+
| db_test11 | CREATE DATABASE `db_test11` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
可以看出db_test11的字符集是为utf8。
三、MySQL表(table)的字符集设置
1. 继承性mysql数据库使用db_test10(字符集为gbk),在创建表时,不指定字符集
mysql> use db_test10;
Database changed
mysql> create table table_test(
-> id INT(10) PRIMARY KEY,
-> name VARCHAR(20));
Query OK, 0 rows affected (0.24 sec)
mysql> SHOW CREATE TABLE table_test;
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| table_test | CREATE TABLE `table_test` (
`id` int(10) NOT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
可以看出table_test表的字符集为gbk;
2. 在创建表时特意指定字符集,假设指定为utf8
mysql> CREATE TABLE table_test1( id INT(10) PRIMARY KEY, name VARCHAR(20)
-> )DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.22 sec)
mysql> show create table table_test1;
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| table_test1 | CREATE TABLE `table_test1` (
`id` int(10) NOT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
可以看出table_test1的字符集为指定的字符集utf8。
四、在MySQL表中列(column)字符集设置方法:
1. 继承表的字符集,不为列特意指定,上面的table_test1表的中列的字符集为:
show full columns from table_test1;
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| id | int(10) | NULL | NO | PRI | NULL | | select,insert,update,references | |
| name | varchar(20) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.00 sec)
可以看出name是utf8。
2.在创建表时,为列指定特定字符集(假设表的字符集为utf8, 而列的字符集为gbk)
mysql> CREATE TABLE table_test3(
-> id INT(10) PRIMARY KEY,
-> name VARCHAR(20) character set gbk default NUll
-> ) DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.25 sec)
mysql> show full columns from table_test3;
+-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
| id | int(10) | NULL | NO | PRI | NULL | | select,insert,update,references | |
| name | varchar(20) | gbk_chinese_ci | YES | | NULL | | select,insert,update,references | |
+-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
可以看出name字段的字符集为gbk。
以上就是Mysql字符集的继承性和字符集默认的优先级关系。
本文学习自:http://hi.baidu.com/11haiou/item/212707dad7395f5ffb5768d3