zoukankan      html  css  js  c++  java
  • MySQL字符集小结

    一:什么是字符集

     
    字符集支持多层面:服务器层(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

    mysql使用utf8mb4经验吐血总结
    https://mp.weixin.qq.com/s?__biz=MzAwMDU2ODU3MA==&mid=2247484084&idx=1&sn=e3740e1087dc73ffcdc4b56bfeaaaa6d&chksm=9ae7bf21ad9036370e8174995ff73775a0ff8c8a51b9995fc8675a994a768a136d187e2aa76d#rd


     
     
  • 相关阅读:
    Window Phone 8手电筒
    Wp检查手机网络状态
    Wp 导航到手机定位设置页面
    Wp8 读取手机信息
    移动端丨-webkit-overflow-scrolling:touch属性导致页面卡住
    小程序丨canvas内容自适应不同尺寸屏幕
    钉钉自带浏览器版本过低,导致Object.assign不兼容...
    HTTP中GET与POST的区别
    git丨Push rejected: Push to origin/master was rejected
    小程序丨嵌套循环
  • 原文地址:https://www.cnblogs.com/l10n/p/9400361.html
Copyright © 2011-2022 走看看