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


     
     
  • 相关阅读:
    flume sink两种类型 file_rool 自定义sing com.mycomm.MySink even if there is only one event, the event has to be sent in an array
    为什么引入进程20年后,又引入线程?
    As of Flume 1.4.0, Avro is the default RPC protocol.
    Google Protocol Buffer 的使用和原理
    Log4j 2
    统一日志 统一订单
    网站行为跟踪 Website Activity Tracking Log Aggregation 日志聚合 In comparison to log-centric systems like Scribe or Flume
    Percolator
    友盟吴磊:移动大数据平台的架构、实践与数据增值
    Twitter的RPC框架Finagle简介
  • 原文地址:https://www.cnblogs.com/liang545621/p/9400361.html
Copyright © 2011-2022 走看看