字符集概述
字符集: 一套文字符号及编码、比较规则的集合。
ASCII: 最早的标准字符集, 包含英文字母、阿拉伯数字、标点符号和33个控制字符。定长,一个字符7位编码。
Unicode: 为了统一各种语言,基本能包括所有已知再用的字符。 一个字符4个字节编码。UTF-8/UTF-16 定义了这个4个字节的编码在计算机中如何表示(如部分ASCII可以单字节表示, 等等)
UTF-8: 非定长,1-4字节编码。互联网上广泛支持的Unicode编码方式。
汉字及常见字符集
GB2312-80: 1980年发布, 定长,双字节编码, 收录了 6763 个常用汉字和 682个非汉字图形符号。
GBK: 完全兼容GB2312, 定长,双字节编码,收录了20902+增补的52个汉字。
GB18030: 扩展了GBK,非定长,相同部分双字节编码,其他四字节编码,收录27,484CJK汉字。
Mysql上如何选择字符集
- 如需支持多国语言,选择UTF-8。
- 如果只支持中文,且中文很多, 又要求性能高, 可以选择GBK。因为GBK对中文是双字节编码,UTF-8是三字节编码。但是如果大部分都是英文,选择UTF-8优于GBK, 英文在UTF-8中是单字节编码,在GBK中是双字节编码。
- 定长相较于非定长,在做字符运算(比较、排序)时效率更高。
Mysql 可以针对底层的对象如一个表的某一个字段来指定它的字符集。
每个字符集都有多个校对规则。校对规则决定了字符串比较方式。以gbk为例:
*_ci: 大小写不敏感,*_cs: 大小写敏感,*_bin: 基于字符编码比较。
show character set; --查看MySql支持的字符集
show collation like 'gbk%'; --查看gbk的校对规则
设置Mysql的字符集
四个级别:服务器级、数据库级、表级、字段级
- 服务器字符集和校对规则
1 my.cnf中设置
[mysqld]
default-character-set=gbk
2 启动选项时指定:
mysqld –default-character-set=gbk
3 编译时指定:
./configure –with-character=gbk
指定字符集的时候,可以同时指定对应的校对规则(如果你使用该字符集非默认的校对
规则)
如果没有指定字符集,那么会默认使用latin1。
show variables like 'character%';--查看默认字符集
show variables like 'collation%';--查看默认校对规则
数据库级字符集和校对规则
1 创建数据库的时候指定。
2 可以通过alter database 来修改,修改不会对已有数据产生影响。表级字符集和校对规则
1 创建表的时候指定。
2 可以通过alter table来修改,修改不会对已有数据产生影响。
show create table t1;--查看t1的默认字符集和校对规则
列级字符集和校对规则
1 创建表的时候指定。
2 可以通过alter table来修改,修改不会对已有数据产生影响。
3 如果不指定,默认使用表的定义。连接字符集和校对规则
客户端和服务器的交互操作,MylSQL 提供了 3 个不同的参数:character_set_client、
character_set_connection 和 character_set_results, 分别代表客户端、 连接和返回
结果的字符集, 可以使用
set names utf8; --本次连接使用的字符集, 同时指定上述三个参数。
还可以指定字符串常量字符集:
select _gbk '测试';--字符串常量指定字符集
- 字符集修改步奏
希望修改字符集,但又担心已有数据修改不了,可以按照下面步奏:
(1)导出表结构:
mysqldump -uroot -p --default-character-set=gbk -d databasename>
createtab.sql
结构,不导出数据。
(2)手工修改 createtab.sql 中表结构定义中的字符集为新的字符集。
(3)确保记录不再更新,导出所有记录。mysqldump -uroot -p --quick
--no-create-info --extended-insert --default-character-set=latin1
databasename> data.sql
–quick:该选项用于转储大的表。它强制 mysqldump 从服务器一次一行地检索表中
的行而不是检索所有行,并在输出前将它缓存到内存中。
–extended-insert:使用包括几个 VALUES 列表的多行 INSERT 语法。这样使转储文
件更小,重载文件时可以加速插入。
-no-create-info:不写重新创建每个转储表的 CREATE TABLE 语句。
–default-character-set=latin1: 按照原有的字符集导出所有数据, 这样导出的文件
中,所有中文都是可见的,不会保存成乱码。
(4)打开 data.sql,将 SET NAMES latin1 修改成 SET NAMES gbk。
(5)使用新的字符集创建新的数据库。
create database databasename default charset gbk;
(6)创建表,执行 createtab.sql。
mysql -uroot -p databasename < createtab.sql
(7)导入数据,执行 data.sql。
mysql -uroot -p databasename < data.sql
* 目标字符集最好是源字符集的超集。