博客列表 >MySQL数据库字符编码

MySQL数据库字符编码

福哥的博客
福哥的博客原创
2017年07月24日 21:26:451269浏览

一.字符编码概述:
    从本质上来说,计算机只能识别二进制代码,因此,不论是计算机程序还是其他被处理的数据,最终都必须转换成二进制,计算机
才能认识。为了使计算机不仅能做科学计算,也能处理文字信息,人们想出了给每个文字符号编码以便于计算机识别处理,这就是计算
机字符集的由来。简单的说字符集就是一套文字符号及编码、比较规则的集合。
    20世纪60年代初期,美国标准化组织ANSI发布了第一个计算机字符集ASCII(American Standard Code for Information Interchange,
美国信息交换标准码),后来进一步变成了国际标准ISO-646,这个字符集采用7位编码,定义了包括大小写英文字母、阿拉伯数字和标
点符号,以及33个控制符号等。虽然现在看来,这个美式的字符集很简单,包括的符号也很少,但是直到今天它依然是计算机世界里奠
定性的标准,其后制定的各种字符集基本都兼容ASCII字符集。
    自从ASCII之后,为了处理不同的文字,各大计算机公司、各国***、标准化组织等先后发明了几百种字符集,比如我们熟悉的
ISO-8859系列、GB2312-80、GBK、BIG5等。这些五花八门的字符集,从收录的字符到编码规则各不相同,给计算机软件开发和移植带来
了很大的困难。一个软件要在使用的不同文字的国家或地区发布,必须进行本地化开发!基于这个原因,统一字符编码,成了20世纪80
年代计算机业的迫切需要和普遍共识。
    为了统一字符编码,国际标准化组织ISO(International Standardization Organization)的一些成员国于1984年发起新的国际
字符集标准,以容纳全世界各种语言文字和符号。这个标准最后叫做通用字符集(Universal Character Set,简称UCS),标准编号为
ISO-10646。ISO-10646标准采用4个字节编码,因此简称UCS-4。
    ISO-10646标准发布之后,遭到了部分美国计算机公司的反对。1988年Xerox公司提议制定新的以2个字节编码的统一字符集Unicode,
并联合Apple、IBM、DEC、Sun、Microsoft、Novell等公司成立Unicode协会,并成立Unicode技术委员会,专门负责Unicode文字的收集、
整理和编码,并与1991年推出了Unicode1.0
    那么问题来了,ISO和Unicode协会推出了两个不同的编码标准,这显然是不利的。后来大家都认识到了这一点,经过双发谈判,
1991年10月达成协议,ISO将Unicode编码并入ISO-10646标准里面。此时ISO-10646其实包括
基本多语言文字面(BMP,也就是并入的Unicode编码)、
辅助字面、专用字面,
其中辅助字面用以收录ISO-10646后续收集的各国文字,专用字面供使用者自定义收录ISO-10646未收录的
文字符号。其实,大部分用户只使用BMP字面就足够了,早期的ISO-10646-1标准也只要求实现BMP字面部分即可,这样只需要2个字节(简称UCS-2编码)
来编码就足够了,UCS-2编码转换成UCS-4编码也很容易,只要在前面加两个取值为0的字节即可!
    ISO-10646标准的编码空间足以容纳人类从古至今使用过得所有文字和符号,但其实许多文字符号否已经很少使用,超过99%的在用
文字符号都编入了ISO-10646里面的BMP(基本多语言文字面)部分,所以绝大部分情况下,Unicode的双字节编码方式都能满足需求,而
这种双字节编码方式比起ISO-10646的4字节原始编码来说,在节省内存和处理时间上都具有优势,这也是Unicode编码方式更流行的原因。
但是如果万一碰到要使用ISO-10646 BMP字面以外的文字怎么办呢?Unicode提出了名为UTF-16或代理法的解决方案,
UTF是UCS/Unicode Transformation Format的缩写。但是当时的计算机和网络世界还是ASCII的天下,只能处理单字节流,
UTF-16在离开Unicode环境后,在传输和处理中都存在问题,于是Unicode又提出了名为UTF-8的解决方案。
    ISO-10646与Unicode统一以后,两个组织虽然都继续发布各自的标准,但二者之间是一致的。由于Unicode最早投入应用,其编码方
式更加普及,因此许多人都知道Unicode,但对ISO-10646却了解不多。但是由于两者是一致的,因此根本不需要区分两者了,对于现在
来说Unicode和ISO-10646,一般指的是同一个东西!
    两者不同版本的对应关系:
    Unicode2.0等同于ISO/IEC 10646-1:1993
    Unicode3.0等同于ISO/IEC 10646-1:2000
    Unicode4.0等同于ISO/IEC 10646:2003
    
二、汉字常见字符集
    在计算机发展的不同阶段,我国也参照当时的国际标准和实际需要,制定了一些汉字字符集编码标准
    1.GB2312-80:
        即GB2312,是中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集 基本集》,1980年发布,1981年5月1日实施。
        GB2312编码通行于中国大陆,中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312
    2.GBK:
        汉字内码扩展规范,发布于1995年,在GB2312的基础上做了扩充,且对GB2312完全兼容,但是GBK并不是一个强制性的国家标准,只是一个
        行业指导规范,并没有强制力,但是由于得到了微软windows95的支持而大为流行
三、国际编码UTF-8
    是一种针对Unicode的可变长度字符编码,通用性很好。

四、常用字符集比较
    ACSII:单字节7位编码,最早的奠定性字符集
    ISO-8859-1/latin1:单字节8位编码,西欧字符集
    GB2312-80:双字节编码,早期标准
    GBK:双字节编码,虽然不是国标但是支持的系统很多
    UTF-32:4个字节编码,UCS-4原始编码,目前很少采用
    UCS-2:2字节编码,windows2000内部用UCS-2
    UTF-16:2字节或4字节编码,Java和Windows XP/NT等内部使用UTF-16
    UTF-8:1~4字节编码,互联网和Unix/Linux广泛支持的Unicode字符集,UTF-8汉字编码需要使用3个字节

五、MySQL支持的字符集
    1.查看所有可用的字符集
        show character set;
        或者查看information_schema.character_sets,也可以显示所有的字符集和该字符集默认的校队规则
    2.MySQL的字符集包括字符集(character)和校对规则(collation)两个概念。
        1)字符集用来定义MySQL存储字符串的方式
        2)校对规则用来定义 字符串比较的方式
        3)字符集和校对规则是一对多的关系,一个字符集有多个校对规则供你选择!
          校对规则命名约定:它们以相关的字符集名开始,通常包括一个语言名,并且以
          _ci(忽略大小写)、
          _cs(大小写敏感)或者
          _bin(二元,即比较是基于字符编码的值而与language无关)结束。
        查看字符集的校对规则:
            show  collation like '字符集前缀%';

六、MySQL内部的字符集和校对规则设置
    MySQL内部的字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级
    1.服务器字符集和校对规则设置
        1)在配置文件中设置
            [mysqld]
            character-set-server=utf8
        2)或者在启动项中指定
            mysqld --character-set-server=utf8
        3)或者在编译的时候指定
    2.数据库字符集和校对规则设置
        数据库的字符集和校对规则在创建数据库的时候指定,也可以在创建完数据库后通过alter database命令修改.需要注意的是如果数据库里已经有数据存在,因为修改字符集并不能将
        已有的数据按照新的字符集进行存放,所以不能通过修改数据库的字符集直接修改数据的内容,需要重新导出,然后修改字符编码再导入来解决!
        设置数据库字符集的规则如下:
        1)如果指定了字符集和校对规则,则使用指定的字符集和校对规则
        2)如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则
        3)如果指定了校对规则但未指定字符集,则使用与该校对规则关联的字符集
        4)如果没有指定字符集和校对规则,则使用服务器字符集和校对字符集和校对规则作为数据库的字符集和校对规则
        CREATE DATABASE db_name
        [[DEFAULT] CHARACTER SET charset_name]
        [[DEFAULT] COLLATE collation_name]
        
        ALTER DATABASE db_name
        [[DEFAULT] CHARACTER SET charset_name]
        [[DEFAULT] COLLATE collation_name]
        
        查看当前数据库的字符集和校对规则:
            show variables like 'character_set_database';
            show variables like 'collation_database';
    3.表字符集和校对规则设置
        表的字符集和校对规则在创建表的时候指定,也可以通过alter table 命令进行修改,同样的是如果表中已经有数据那么修改字符集对原来的记录并没有影响,不会按照新的字符集进行存放!
        设置表字符集的规则如下:
        1)如果指定了字符集和校对规则,则使用指定的字符集和校对规则
        2)如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则
        3)如果指定了校对规则但未指定字符集,则使用与该校对规则关联的字符集
        4)如果没有指定字符集和校对规则,则使用数据库字符集和校对字符集和校对规则作为表的字符集和校对规则
        CREATE TABLE tbl_name (column_list)
        [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
 
        ALTER TABLE tbl_name
        [DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
    4.字段(列)字符集和校对规则
        遇到这种情况概率比较小,这只是MySQL提供给我们一个灵活设置的手段

七、MySQL连接字符集设置
    连接字符集设置:客户端和服务器之间交互的字符集
    1.对于客户端和服务器段的交互***作,MySQL提供了3个不同的参数:
        1)character_set_client:客户端来源数据使用的字符集
        2)character_set_connection:连接层字符集
        3)character_set_results:返回结果字符集
        知识拓展:数据在客户端和服务器之间交互的过程中字符集转换的大概过程
            1) MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
            2) 进行内部***作前将请求数据从character_set_connection转换为内部***作字符集,内部***作字符集的确定方法如下:
                1>使用每个数据字段设定的字符集;
                2>若上述值不存在,则使用对应数据表设定的字符集;
                3>若上述值不存在,则使用对应数据库设定的字符集;
                4>若上述值不存在,则使用服务器设定的字符集。
            3) 将***作结果从内部***作字符集转换为character_set_results。
        这3个参数设定的字符集应该相同,并且客户端使用的字符集确实是参数character_set_client的值,才可以确保用户的数据可以正确的返回且输出。
        查看当前设置:show variables like 'character_set%';
        修改:
            set names 字符集,可以同时修改3个参数的值,对本次有效
            也可以在配置文件中设置:
                [mysql]
                default-character-set=字符集
        修改CMD命令行字符集:
            chcp 65001   #换成utf-8代码页(设置为utf-8之后最好手动修改显示字体 )
            chcp 936     #换成默认的gbk

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议