MYSQL复习笔记6-字符集

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 hosts\G

我们看到使用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测试

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。