mysql字符集設定分了四級,它們依次爲服務器級、數據庫級、表級、列級,只要有須要,這些字符集能夠任意指定。mysql
固然,mysql字符集四級設定存在一個繼承關係,即在不指定字符集的狀況下,數據庫字符集將繼承服務器的,而表的將繼承數據庫的,列的將繼承表的。sql
舉例來講,初始指定的服務器字符集爲gbk,那麼在建立數據庫時若是不爲該數據庫指定字符集,那麼數據庫建立後,該數據庫的字符集就是gbk(服務器字符集);一樣的,在該數據庫下建立表時,若不爲該表指定字符集,則表的字符集就爲gbk(數據庫字符集);這一規則一樣適用於列,若不指定則爲表的字符集。數據庫
以上四級字符集存在一個繼承關係,並特別強調是在不特別指定的狀況下發生,鑑於此,那麼在特別指定的狀況下會是怎麼樣的呢?原來,mysql的四級字符集不但存在繼承關係,並且也存在優先級關係,它們的優先級有高到低依次爲列級、表級、數據庫級、服務器級。服務器
舉例來講,若是初始指定的服務器字符集爲gbk,那麼在建立數據庫的時若指定的字符集是gb2312,那麼該數據庫的字符集就是gb2312;一樣的,若在該庫下建立表時指定的表的字符集是utf8,那麼表的字符集就是utf8,在建立表時若指定的列的字符集是latin1,那麼列的字符集就是latin1。socket
瞭解了mysql字符集的四級設定,那麼該如何建立呢?下面就以Linux中的mysql服務器爲例予以分別介紹。spa
一:mysqld服務器(server)字符集設置方法(假設設置爲utf8):命令行
1.修改mysql服務器的啓動腳本mysql.server((在/etc/rc.d/init.d/目錄))orm
在mysql.server文件中,找到start參數段,修改使之相似下面命令行:server
$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)