9.字符集
9.1 字符集概述
字符集就是一套文字符号及其编码、比较规则的集合。
ASCII(American Standard Code for Information Interchange)字符集:采用7位编码,包括大小写英文字母、阿拉伯数字和标点符号,及33个控制符号等。
9.2 Unicode字符集
ISO-10646采用4字节编码,简称UCS-4,将代码空间分为4部分(组group、面plane、行row、格ceil),每部分各占一个字节。
Unicode采用2字节编码,Unicode编码被纳入UCS-4的0组0面,称为基本多语言字面,共65534个码位。
UTF是USC和Unicode格式转换(Transformation Format)的缩写,分为UTF-8和UTF-6.
UTF-8按一定规则将ISO-10646或Unicode字元码转换成1~4个字节的编码,其中将ASCII码(0~0x7F)转换成单字节编码。

9.3 汉字及一些常见字符集
GB 2312-80 双字节编码字符集,收录6763个常用汉字。
GB 13000 除收录GB 2312-80外还收录全部汉字及偏旁部首,共27484个。
GBK 除收录GB 2312-80外还收录中日韩全部汉字及偏旁部首,共20902个。
GB18030 2字节或4字节编码,兼容GB13000和GBK。
字符集 是否定长 编码方式 其他说明
ASCII 是 单字节7位编码 最早的、奠基性字符集
latin1 是 单字节8位编码 西欧字符集
GBK 是 双字节编码
UTF-8 否 1~4字节编码

9.4 怎样选择合适的字符集
考虑因素:UTF-8
满足应用对语言的需求,尽量选择支持多语言的字符集;
考虑对已有数据的兼容;尽量选择已有数据的超集,而非子集;
考虑字符集编码长度对性能的影响,尽量选择编码长度短的字符集;
考虑字符运算对性能的影响,尽量选择定长字符集,而非变长字符集;
考虑客户端程序对字符集的支持,尽量保持前后端字符集一致,避免发生字符集转换。

9.5 Mysql支持的字符集简介
Mysql支持统一台服务器不同的数据库、同一个数据库不同的表、同一个表不同列可以使用不同的字符集。
Mysql字符集分为4个层级:服务器字符集、数据库字符集、表字符集、列字符集。
Mysql字符集包括字符集(character)和校对规则(collation)两部分,
字符集(character)用来定义存储字符串的方式;
校对规则(collation)用来定义比较字符串的方式;
字符集和校对规则是一对多关系,即一个字符集可以有多个校对规则;
每个字符集默认对应一个校对规则。
校对规则命名:
字符集_语言名_ci大小写不敏感
字符集_语言名_cs大小写敏感
字符集_bin基于字符编码的值比较与语言无关,对大小写敏感

查看可用字符集:
show character set;
或者查看information_schema.character_set表
查看某个字符集的所有校对规则和默认校对规则:
show collation like 'gbk%';
或者查看information_schema.collations表
例子:
select case when 'A' COLLATE gbk_chinese_ci ='a' COLLATE gbk_chinese_ci then 1 else 0 end;
select case when 'A' COLLATE gbk_bin ='a' COLLATE gbk_bin then 1 else 0 end;

9.6 Mysql字符集的设置
Mysql字符集分为4个级别:服务器字符集、数据库字符集、表字符集、列字符集。
9.6.1 服务器字符集和校对规则
在my.cnf文件中设置:
[mysqld]
character-set-server=gbk
在启动项中指定:
mysqld --character-set-server=gbk
在编译时指定:
cmake -DDEFAULT_CHARSET=gbk
默认使用latin1作为服务器字符集;
在设置字符集时没有指定校对规则,默认使用字符集默认校对规则;
如果要使用字符集非默认校对规则,则需要在设置字符集时一同设置校对规则。
查看当前服务器字符集和校对规则:
show variables like 'character_set_server';
show variables like 'collation_server';

9.6.2 数据库字符集和校对规则
数据库字符集和校对规则在创建数据库时指定,也可以在创建完数据库后通过alter database命令进行修改。
查看当前数据库字符集和校对规则:
show variables like 'character_set_database';
show variables like 'collation_database';
数据库字符集起效规则:
当设置了数据库字符集和校对规则时,则使用指定的字符集和校对规则;
当设置了数据库字符集且未设置校对规则时,则使用指定的字符集和字符集默认校对规则;
当未设置数据库字符集但设置了校对规则时,则使用指定的校对规则和与该校对规则关联的字符集;
当未设置数据库字符集和校对规则时,则使用服务器字符集和校对规则。

9.6.3 表字符集和校对规则
表字符集和校对规则在创建表时指定,也可以在创建完表后通过alter table命令进行修改。
查看当前表字符集和校对规则:
show create table table_name;
表字符集起效规则:
当设置了表字符集和校对规则时,则使用指定的字符集和校对规则;
当设置了表字符集且未设置校对规则时,则使用指定的字符集和字符集默认校对规则;
当未设置表字符集但设置了校对规则时,则使用指定的校对规则和与该校对规则关联的字符集;
当未设置表字符集和校对规则时,则使用数据库字符集和校对规则。

9.6.4 列字符集和校对规则
在建表时可以为不同列设置不同的字符集,也可以使用alter table table_name modify column col_name为列修改为不同的字符集。
一般表中所有列与表保持相同的字符集和校对规则。

9.6.5 连接字符集和校对规则
连接字符集和校对规则时客户端与服务器交互的字符集和校对规则。
参数character_set_client、character_set_connection、character_set_results分别代表客户端、连接和返回结果的字符集。
这三个参数要保持相同,才能确保写入的数据能够被正确读出。
同时设置3个参数的命令:
set names gbk;
一次设置了3个参数的字符集,但只对一次连接有效。
在my.cnf中设置:
[mysql]
default-character-set=gbk
对所有连接都有效。
字符串常量的字符集由参数character_set_connection决定。
可以通过命令修改字符串常量的字符集,
例子:
select -gbk '字符串常量';
select -utf-8 '字符串常量';

9.7 字符集的修改步骤
将latin1字符集的数据库修改成GBK字符集的过程如下:
1)导出表结构
mysqldump -uroot -p --default-character-set=gbk -d scott > C:\table.sql
说明:
--default-character-set=gbk 设置连接字符集为gbk
-d 只导出表结构,不导出数据
2)手工修改scott.sql中表结构定义中的字符集为新的字符集
3)确保记录不再更新,导出所有记录
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename> C:\data.sql
说明:
--quick 用于转储大的表,强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行,并在输出前将它缓存到内存中。
--extended-insert 使用包括几个values列表的多行insert语法,导出文件更小,导入时速度更快。
--no-create-info 不导出create table语句,只导数据
--default-character-set=latin1 按照原有的字符集导出所有数据,保证中文不会出现乱码
4)打开导出文件,将set names=latin1修改为set names=gbk;
5)使用新的字符集创建新的数据库。
create databases db_name default charset gbk;
6)创建表,执行table.sql
mysql -uroot -p db_name < table.sql
7)导入数据,执行data.sql
mysql -uroot -p db_name < data.sql

9.8 小结

9.Mysql字符集的更多相关文章

  1. 如何修改MySQL字符集

    首先,MySQL的字符集问题主要是两个概念,一个是Character Sets,一个是Collations,前者是字符内容及编码,后者是对前者进行比较操作的一些规则.这两个参数集可以在数据库实例.单个 ...

  2. Mysql字符集设置

    转 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodi ...

  3. MySQL字符集

    字符集的选择 1.如果数据库只需要支持中文,数据量很大,性能要求也很高,应该选择双字节定长编码的中文字符集(如GBK).因为相对于UTF-8而言,GBK"较小",每个汉字只占2个字 ...

  4. mysql5.5字符集设置的一点变化(对于中文乱码问题,需要设置mysql字符集)

    工作中因为字符集问题没少头疼,还犯过一次错误,还好拯救及时,没有发生重大事故,唉,弄清楚点还是非常有必要的: 例如我的工作环境为CTR+redhat5+mysql5.5 在导入sql语句的时候必须要注 ...

  5. Mysql字符集知识总结

    字符集&字符编码方式 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,这里的字符可以是英文字符,汉字字符,或者其他国家语言字符. 常见字符集 ...

  6. MySQL字符集的修改和查看

    1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). MySQL对于字符集 ...

  7. MySQL字符集转换引发插入乱码问题

    根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect st ...

  8. MySQL 字符集设置

    /*************************************************************************** * MySQL 字符集设置 * 说明: * 数 ...

  9. [MySQL] 字符集的选择

    1. Mysql支持的字符集 MySQL服务器可以支持多种字符集,不同的字段都可以使用不同的字符集. 查看所有可用字符集: show character set; select * from info ...

  10. Mysql字符集设置 2 图

    基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如'A'.'B'等: • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodin ...

随机推荐

  1. JAVAWEB 一一ibatis(框架)

    ,升级版是mybatis,在配置文件里写sql语句对字段进行CURD) jar包 sqlMapConfig <?xml version="1.0" encoding=&quo ...

  2. python递归、collections系列以及文件操作进阶

    global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults log global mode http t ...

  3. 初探 objc_msgSend函数

    1.0 执行某个对象的方法    [receiver message] 被编译为: id objc_msgSend(id self,SEL op,...): objc_msgSend 发送信息的过程 ...

  4. ios instancetype 和 id 的异同

    1.0 相同点:都可以作为方法的返回类型 2.0 不同点: a.instancetype 可以返回和方法所在类相同类型的对象   id 只能返回未知类型的对象 b. instancetype 只能作为 ...

  5. js高级-执行上下文

    全局上下文  方法1() 压入 (栈的数据结构 先进后出)push()  pop() 1.当一个函数在调用另外一个函数的时候新调用的函数会行成一个新的执行上下文 压入执行环境栈的栈顶 2.浏览器js执 ...

  6. oracle 中如何定位重要(消耗资源多)的SQL

    链接:http://www.xifenfei.com/699.html 标题:oracle 中如何定位重要(消耗资源多)的SQL 作者:惜分飞©版权所有[文章允许转载,但必须以链接方式注明源地址,否则 ...

  7. akka共享内存

    Akka共享内存 Akka中的共享内存是基于Actor模型的,Actor模型提倡的是:通过通讯来实现共享内存,而不是用共享内存来实现通讯,这点是跟Java解决共享内存最大的区别,举个例子: 在Java ...

  8. float double

    float : 单精度浮点数 double : 双精度浮点数 两者的主要区别如下: 01.在内存中占有的字节数不同 单精度浮点数在机内存占4个字节 双精度浮点数在机内存占8个字节 02.有效数字位数不 ...

  9. rem是如何实现自适应布局的

    原文链接:http://caibaojian.com/web-app-rem.html 摘要:rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个px字号,则可以来算 ...

  10. sql数据库之多库查询

    连接到数据库服务器gwsps07上,打开查询分析器,如何获取gwrenshi数据库中的数据? 查询语句如下: select * from GWRENSHI.CGC.dbo.PERempms(serve ...