一:什么是字符集
字符集支持多层面:服务器层(server)、数据库层(database)、数据表(table)、字段(column)、连接(connect)、结果集(result)。
1.字符集是一套符号和编码规则,字符串必须有相应的字符集。
2.校验集是这套符号和编码的校验规则,定义字符排序规则,字符串之间比较的规则。
3.非ASCII字符在不同字符集中,其所需的字节数是不一样的。
4.多字节字符间是以字符进行比较,而非以字节为单位比较。
5.个别校验集是二进制的,基于字符对应的数值进行比较。
6.XXX_bin 将字符串中的每一个字符用二进制数据存储,区分大小写。
7.XXX_general_ci 不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
8.XXX_general_cs 区分大小写, cs为case sensitive的缩写,即大小写敏感。
二:常用字符集介绍
(1):gbk/gb2312
1.gb2312是双字节字符集,不论中、英字符均使用双字节来表示,为了区分中文,将其最高位都设为1.
2.gb2312是gbk的子集,gbk是gb18030的子集。
3.gbk包括中日韩字符的大字符集合。
4.通常使用gbk字符集足够。
5.国际通用性比utf8差,不过utf8占用的数据库比gbk大(三字节字符集)。
6.gbk、gb2312等字符集与utf8之间必须通过unicode编码才能互相转换。
gbk、gb2312 => Unicode => utf8
utf8 => Unicode => gbk、gb2312
(2):utf8
1.8-bit Unicode Tuansformation Format,三字节字符集。
2.是Unicode的一种存储方式,可变长度字符编码,又称万国码。
3.UTF-8使用可变长度字节来存储 Unicode字符,例如ASCII字母继续使用1个字节存储,重音文字、希腊文字或西里尔字母等使用2个字节来存储,而常用的汉字就要使用3个字节。
4.数据库字符集尽量使用UTF8(客户端连接connect)及结果(result)字符集也采用UTF8字符集,最终HTML页面亦是采用UTF8。
http://baike.baidu.com/view/25412.htm
ASCII是7位字符集,但不能覆盖欧洲语言中的特殊字符。
lantin1是7位字符集,但不能覆盖亚洲,非洲语言。
unicode是lantin1的扩展,增加了亚洲、非洲常规语言支持,但仍不支持全部语言,且ASCII用unicode来表示效率不高。
utf8是unicode的扩展。
MySQL 4.x 版本及以前,CHAR(n)表示能存储多少字节数,实际能存储多少字符数和字符集没有关系。
MySQL 4.x 之后的版本,CHAR(n)表示能存储多少字符数,实际能存储多少字符数和字符集有关系。
CHAR(30),UTF-8字符集,最大长度90byte,存储了30个汉字,字节数应该是:90个字节
CHAR(30),UTF-8字符集,最大长度90byte,存储了30个英文,字节数应该是:30个字节
CHAR(30),GBK字符集,最大长度60byte 存储了30个汉字,字节数应该是:60个字节
CHAR(30),GBK字符集,最大长度60byte 存储了30个英文,字节数应该是:30个字节
CHAR(30),LATIN1字符集,最大长度30byte存储了15个汉字,字节数应该是:30个字节
CHAR(30),LATIN1字符集,最大长度30byte存储了30个英文,字节数应该是:30个字节
三:如何转换字符集
latin1转换到utf8
gbk转换到utf8
lantin1转换到gbk
lantin1字符集环境:LANG=en_US.ISO_8859 CRT:default
gbk字符集环境:LANG=en_US.GBK/zh_CN.GBK CRT:default
utf8字符集环境:LANG=en_US.UTF-8 CRT:utf8
1.latin1 =>utf8
以原来的字符集为latin1为例,升级成为utf8的字符集,原来的表:old_table(default charset=latin1),新表:new_table(defaul charset=utf8)。
第一步:导出旧数据
mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table> old.sql
第二步:转换编码(unix/linux环境下)
iconv -t utf8 -f gb2312 -c old.sql >new.sql
或者去掉-f参数,让iconv自动判断原来的字符集
iconv -t utf-8 -c old.sql >new.sql
在这里,假定原来的数据默认是gb2312编码。
第三步:导入
修改new.sql,在插入/更新语句开始之前,增加一条SQL语句:
SET NAMES utf8;
mysqldump -hlocalhost -uroot -B my_db < new.sql
2.gbk => utf8
以原来的字符集为gbk为例,升级成为utf8字符集,原来的表old_table(default charset=gbk),新表:new_table(defalut charset=utf8)
第一步:导出旧数据
mysqldump --default-character-set=gbk -hlocalhost -uroot -B my_db --tables old_table> old.sql
第二步:转换编码(unix/linux环境下)
iconv -t utf-8 -c old.sql >new.sql
或者去掉-f参数,让iconv自动判断原来的字符集
iconv -t utf-8 -c old.sql >new.sql
在这里,假定原来的数据默认是gb2312编码。
第三步:导入
修改new.sql,在插入/更新语句开始之前,增加一条SQL语句:
SET NAMES utf8;
mysqldump -hlocalhost -uroot my_db < new.sql
3.latin1 => gbk
以原来的字符集为gbk为例,升级成为utf8字符集,原来的表old_table(default charset=latin1),新表:new_table(defalut charset=utf8)
第一步:导出旧数据
mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table> old.sql
第二步:导入(省去了第二步转换编码工作)
修改new.sql,在插入/更新语句开始之前,增加一条SQL语句:
SET NAMES gbk;
mysqldump -hlocalhost -uroot my_db < new.sql
How to support full Unicode in MySQL databases
https://mathiasbynens.be/notes/mysql-utf8mb4
10分钟学会理解和解决MySQL乱码问题
http://cenalulu.github.io/mysql/mysql-mojibake/
字符集GBK和UTF8的区别说明
http://blog.csdn.net/zzxian/article/details/7330804