Date: 20100101
Auth:
Jin
参考http://blog.sina.com.cn/s/blog_9707fac301016wxm.html
一、字符集介绍
计算机只处理二进制代码
字符集是一套文字符号及其编码,比较规则的集合。
ascii 啊四克 第一个计算机字符集
unicode UTF8 UTF16
二、汉字及一些常见的字符集
GB2312
BGK :BGK在GB2312基础上进行扩充。
GB 18030
三、怎样选择合适的字符集
(1),满足应用支持语言的需求,如应用于不同的国家和地区,则选择unicod字符集。MYSQL来说,就是UTF-8
(2),如果应用中涉及已有数据的导入,要充分考虑数据库字符集对已有的数据的兼容性,已有数据是GBK,不能选择GB2312
(3),如果数据库只需要支持中文,数据量很大,性能要求也很高,那就应该选择双向字节长编号的中文字符集,比如GBK。
(4),如果数据库需要做大量的字符运算,如比较,排序,选择定长字符集可能更好,因为定长字符集的处理速度要比变长字符集处理速度快。
(5),如果所有客户端程序都支持相同的字符集,应该优先选择该字符集作为数据库字符集,这样可以避免字符集转换带来的性能开销和数据损失。
四、Mysql支持的字符集。
1)查看可用字符集
mysql> show charset ;
mysql> show character set;
mysql> show charset like 'utf%';
默认字符集为:latin1
2)显示所有的字符集和该字符集默认的校对规则
mysql> use mysql;
mysql> desc information_schema.character_sets;
MYSQL包括字符集(character)和校对规则(COLLATION)两个概念。字符集使用来定义MYSQL存储字符串的方式,校对规则是定义了比较字符串的方式。
字符集和校对规则是一对多的关系,
查看校对规则
mysql> show collation;
mysql> show collation like 'utf%';
mysql> show collation like 'gb%';
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| gb2312_chinese_ci | gb2312 | 24 | Yes | Yes | 1 |
| gb2312_bin | gb2312 | 86 | | Yes | 1 |
| gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 |
| gbk_bin | gbk | 87 | | Yes | 1 |
+-------------------+---------+----+---------+----------+---------+
_ci 大小写不敏感
—cs 大小写敏感
—bin 二元,比较基于字符编码的值与language无关
五、Mysql字符集的设置
Mysql字符集和校对规则有4个级别的默认设置、;服务器级,数据库级,表级和字段级。他们分别在不同的地方设置,作用也不相同
(1)服务器字符集和校对规则设置
服务器字符集和校对规则在Mysql启动时确定
a、myc.cnf中设置
[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
----
default-character-set=gbk
default-collation=gbk_chinese_ci
5.0 /5.1版本
5.5 版本为
character_set_server=utf8
b、启动选项中指定
mysqld --default-character-set=gbk
c、在编译时指定它
./configure --with-charset=gbk
也可以在这里设置mysql只支持的字符集
./configure --with-charset=utf8 --with-collation=utf8_bin --with-extra-charsets=big5,ascii,gb2312,gbk,utf8,latin1
确认
mysql> show variables like 'character_set_server';
mysql> show variables like 'character%';
mysql> show variables like 'collation_server';
mysql> status
(2)数据库字符集和校对规则设置
可以在创建数据库时设置,也可以在数据库创建后alter database修改
注意:如果数据库里已存在数据,修改字符集不能修改已经存在数据的字符集。
设置数据库字符集的规则是:
如果设置了字符集和校对规则,在使用指定的字符集和校对规则.
如果设置了字符集但没有设置校对规则,在使用指定的字符集和默认校对规则.
如果没有设置字符集和校对规则,在使用服务器字符集和校对规则.
如果不想使用默认值,建议在创建数据库时指定字符集和默认校对规则.
a、查看服务器默认的数据库字符集和默认校对规则-全局
mysql> show variables like 'character_set_database';
mysql> show variables like 'collation_database';
b、查看某一个数据的字符集和校对规则-单个
mysql> show create database dbtest
c、创建数据库时设置字符集和校对规则
create database dbtest default character set utf8 collate utf8_general_ci;
d、修改已经数据库的字符集和校对规则
注意:如果数据库里已存在数据,修改字符集不能修改已经数据的字符集,需要其他方式才能修改原数据的字符集规则
mysql> alter database dbtest default character set gbk collate gbk_chinese_ci;
(3)表字符集和校对规则设置
可以在创建表时设置,也可以在表创建后alter table修改
注意:如果表里已存在数据,修改字符集不能修改已经存在数据的字符集,已经存在数据的字符集还是原来的字符集
设置表字符集的规则是:
如果设置了字符集和校对规则,在使用指定的字符集和校对规则.
如果设置了字符集但没有设置校对规则,在使用指定的字符集和默认校对规则.
如果没有设置字符集和校对规则,在使用数据库的字符集和校对规则.
如果不想使用默认值,建议在创建数据库时指定字符集和默认校对规则.
a、查看单个表的的字符集和校对规则-单个,全局的就是这个表所在的数据库的字符集和校对规则
mysql> show create table user G
b、在创建表时设定字符集和校对规则
mysql> create table tbl_userinfo (
id int(10) NOT NULL AUTO_INCREMENT,
username varchar(25),
dep char(15),
PRIMARY KEY(id)
)ENGINE=innodb default character set utf8 collate utf8_bin;
索引可以 id int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY
c、修改表的字符集和校对规则
mysql> alter table tbl_userinfo default character set gbk collate gbk_chinese_ci;
(4)列字符集和校对规则设置
基本很少到
5、连接字符集和校对规则
客户端和服务器的交互操作,MYSQL提供了3个不同的参数,character_set_client,character_set_connection,character_set_results,
分别代表,客户端,连接,返回结果的字符集。
通常情况下这三个字符集是相同的,不会单独设置这三个参数,可以通过以下方法来设置:
1)使用命令来设置连接的字符集和校对规则。
mysql> set NAMES gbk;
这种方法需要每次连接数据库后都执行该命令
2)配置文件my.cnf设置
[client]
default-character-set=utf8
#default-character-set=gbk
3)字符串常量的字符集也是由character_set_connection参数来指定的。
六、字符集的修改步骤
应用于开始阶段没有正确设置字符集,在运行一段时间以后才发现存在不能满足要求需要调整,又不想丢弃这段时间的数据,那么久需要进行以下不走进行字符集修改
mysql> show create database zabbix;
mysql> show create table hostsG
我们看到使用latin1字符集,我们目标
a,把服务器的默认字符集修改uft8 ,校对规则修改utf8_general_ci,设置字符集为utf8后默认校对规则就为utf8_general_ci
b、修改zabbix数据库,并且将原来的数据修改为utf8
1)、导出数据表结构,
#mysqldump -uroot -pdiege --default-character-set=utf8 -d zabbix > create_zabbix_database.sql
--default-character-set=utf8 表示以什么字符集连接
-d 表示只导出表结构
2、手动修改create_zabbix_database.sql中定义的字符集为新的字符集
#vim create_zabbix_database.sql
:%s/latin1/utf8/g
3、确保记录不再更新,导出所有记录
#mysqldump -uroot -pdiege --lock-all-tables --quick --no-create-info --extended-insert --default-character-set=latin1 zabbix > zabbix_data.sql
--lock-all-tables 锁住所有的表
--quick 用于转储大的表。强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行,并输出前将它缓存到内存中,。
--no-create-info 不写创建表结构的语句
--extended-insert 使用包括几个VALUES列表的多行INSERT语法,这样转储文件更小,重载文件时可以加速插入
--default-character-set=latin1 按原有字符集导出数据。
4、打开zabbix_data.sql将 SET NAMEs latin1修改为SET NAMES utf8
数据里没有
5、删除原来的zabbix数据库
mysql> drop database zabbix;
6、关闭myslq服务
#/usr/local/etc/rc.d/mysql-server stop
7、修改配置文件/etc/my.cnf 设置默认字符集为utf8
#vim /etc/my.cnf
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
8、启动myslq服务
#/usr/local/etc/rc.d/mysql-server start
无法启动报错 LOG
110910 21:23:21 InnoDB: Waiting for the background threads to start
110910 21:23:22 InnoDB: 1.1.8 started; log sequence number 107574105664
110910 21:23:22 [ERROR] /usr/local/libexec/mysqld: unknown variable 'default-character-set=utf8'
default-character-set这个参数名在最新的MySQL5.5.8中似乎是无效的。
MYSQL 5.5修改了字符集设置参数
应该改成:
character_set_server=utf8
重新修改配置文件启动
character_set_server=utf8
collation_set_server=utf8_general_ci 这个也错误
9、连接mysql测试服务器默认字符集改动是否成功
mysql> show variables like 'character_set_server';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| character_set_server | utf8 |
+----------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'collation_server';
+------------------+-----------------+
| Variable_name | Value |
+------------------+-----------------+
| collation_server | utf8_general_ci |
+------------------+-----------------+
1 row in set (0.00 sec)
创建一个数据测试
mysql> create database tech;
Query OK, 1 row affected (0.00 sec)
mysql> show create database tech;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| tech | CREATE DATABASE `tech` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)
10、创建zabbix 数据库
mysql> create database zabbix default character set utf8;
11、导入数据结构
#mysql -uroot -pdiege zabbix < create_zabbix_database.sql
验证
mysql> show create table users G
12、导入数据
mysql> use zabbix
mysql> source /data/backup/db/20110910/zabbix_data.sql
13、开启zabbix测试