mysql字符集

 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_databasecharacter_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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值