mysql字符集设定分了四级,它们依次为服务器级、数据库级、表级、列级,只要有需要,这些字符集可以任意指定。
当然,mysql字符集四级设定存在一个继承关系,即在不指定字符集的情况下,数据库字符集将继承服务器的,而表的将继承数据库的,列的将继承表的。
举例来说,初始指定的服务器字符集为gbk,那么在创建数据库时如果不为该数据库指定字符集,那么数据库创建后,该数据库的字符集就是gbk(服务器字符集);同样的,在该数据库下创建表时,若不为该表指定字符集,则表的字符集就为gbk(数据库字符集);这一规则同样适用于列,若不指定则为表的字符集。
以上四级字符集存在一个继承关系,并特别强调是在不特别指定的情况下发生,鉴于此,那么在特别指定的情况下会是怎么样的呢?原来,mysql的四级字符集不但存在继承关系,而且也存在优先级关系,它们的优先级有高到低依次为列级、表级、数据库级、服务器级。
举例来说,如果初始指定的服务器字符集为gbk,那么在创建数据库的时若指定的字符集是gb2312,那么该数据库的字符集就是gb2312;同样的,若在该库下创建表时指定的表的字符集是utf8,那么表的字符集就是utf8,在创建表时若指定的列的字符集是latin1,那么列的字符集就是latin1。
了解了mysql字符集的四级设定,那么该如何创建呢?下面就以Linux中的mysql服务器为例予以分别介绍。
一:mysqld服务器(server)字符集设置方法(假设设置为utf8):
1.修改mysql服务器的启动脚本mysql.server((在/etc/rc.d/init.d/目录))
在mysql.server文件中,找到start参数段,修改使之类似下面命令行:
$bindir/mysqld_safe --default-character-set=utf8 --datadir=$datadir --pid-file=$server_pid_file >/dev/null 2>&1 &
启动mysqld后,ps -ef|grep mysqld查看进程,形如:
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --pid-file=/usr/local/mysql/data/CM-124.pid --skip-locking --port=3306 --socket=/tmp/mysql.sock --default-character-set=utf8
注意:在命令行中的“--default-character-set=$字符集”也可以改为“character-set-server=$字符集”,两者适用的mysql版本不同,“--default-character-set=$字符集”只在5.1系列版本使用,而“character-set-server=$字符集”既能在5.1系列中使用,也能在5.5系列中使用。
2.修改mysql服务器的配置文件my.cnf(在/etc目录)
在my.cnf中的[mysqld]节点,在其下面行加入default-character-set=utf8(#如果mysql版本是5.1系列)或character_set_server=uft8(#如果mysql版本是5.1系列和5.5系列)
值得注意的地方:
1.两种设置方案都将改变character_set_database和character_set_server的值,但有时你用show variables like 'chara%';在mysql命令行中查看到其实两种方案都只改变character_set_server的值,但character_set_database的值并未变化,这是因为这两种方案改变的是默认设置(character_set_database的值继承于character_set_server),就是你在不选择任何数据库时查看到的值。而假如你选择了一个数据库(use db_name;),它并不会更改已有数据库的字符集设置(character_set_database的优先级高于character_set_server)。
2.建议两种方案任选其一,当两种方案同时进行时,mysql.server文件中命令行中的字符集设置优先级高于my.cnf关于字符集的设置,即将两种方案同时进行时,将忽略my.cnf中[mysqld]节点的字符集设置。
3.两种方案都将在重启mysqld进程后生效
二:Mysql数据库(database)字符集设置方法:
1.继承mysql服务器字符集(假设为utf8),即在创建数据库时,不指定字符集
mysql> show variables like 'chara%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /var/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------+
7 rows in set (0.00 sec)
mysql> Create database db_test2;
Query OK, 1 row affected (0.00 sec)
mysql> show create database db_test2;
+----------+-------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------+
| db_test2 | CREATE DATABASE `db_test2` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
2.在创建数据库时,特意指定字符集
mysql> create database db_test default character set gbk;
Query OK, 1 row affected (0.04 sec)
mysql> show create database db_test;
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| db_test | CREATE DATABASE `db_test` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.01 sec)
三:Mysql表(table)字符集设置方法:
1.继承mysql数据库的字符集(假设为gbk),即在创建表时,不指定字符集
mysql> use db_test;
Database changed
mysql> CREATE TABLE table_test (
-> pid varchar(20) NOT NULL,
-> pname varchar(20) default NULL,
-> PRIMARY KEY (pid)
-> ) ENGINE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> show CREATE TABLE table_test;
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| table_test | CREATE TABLE `table_test` (
`pid` varchar(20) NOT NULL,
`pname` varchar(20) default NULL,
PRIMARY KEY (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
2.在创建表时,特意指定字符集(假设为utf8,而数据库的为gbk)
mysql> use db_test;
Database changed
mysql> CREATE TABLE table_test1 (
-> pid varchar(20) NOT NULL,
-> pname varchar(20) default NULL,
-> PRIMARY KEY (pid)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> show CREATE TABLE table_test1;
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| table_test1 | CREATE TABLE `table_test1` (
`pid` varchar(20) NOT NULL,
`pname` varchar(20) default NULL,
PRIMARY KEY (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
四:Mysql表中列(column)字符集设置方法:
1.继承表的字符集,不为列特意指定
如上例中表table_test1(表的字符集为utf8)的列
mysql> show full columns from table_test1;
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| pid | varchar(20) | utf8_general_ci | NO | PRI | | | select,insert,update,references | |
| pname | varchar(20) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.02 sec)
2.在创建表时,为列指定特定字符集(假设表的字符集为gbk,而列的字符集为utf8)
mysql> CREATE TABLE table_test2 (
-> pid varchar(20) character set utf8 NOT NULL,
-> pname varchar(20) character set utf8 default NULL,
-> PRIMARY KEY (pid)
-> ) ENGINE=MyISAM DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.02 sec)
mysql> show full columns from table_test2;
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| pid | varchar(20) | utf8_general_ci | NO | PRI | | | select,insert,update,references | |
| pname | varchar(20) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.01 sec)