MySQL--字符集

1.字符集概述

  • 简单的说字符集就是一套文字符号及其编码、比较规则的集合
  • 20世纪60年代初期,美国标准化组织ANSI发布了第一个计算机的字符集ASCII(American Standard Code for Information Interchange),后来进一步变成了国际标准ISO-646。这个字符集采用7位编码,定义了包括大小写英文字母、阿拉伯数字和标点符号,以及33个控制符号等。

2.Unicode简述

  • 为了统一字符编码,国际标准化组织ISO(International Organization for Standardization)的一些成员国于1984年发起制定新的国际字符集标准,以容纳全世界各种语言文字和符号。这个标准最后叫做Universal Multiple-Octet Coded Character Set,简称UCS,标准编号则定位ISO-10646。ISO-10646标准采用4字节(32bit)编码,因此简称UCS-4。
  • ISO-10646发布以后,遭到了部分美国计算机公司的反对。1988年Xerox公司提议指定新的以16为编码的统一字符集Unicode,并联合Apple, IBM, DEC, Sun, Microsoft, Novell等公司成立Unicode协会(The Unicode Consortium),并成立Unicode技术委员会(Unicode Technical Committee),专门负责Unicode文字的搜集、整理合编码,并于1991年推出了Unicode 1.0
  • 1991年10月,ISO将Unicode编码并入ISO-10646的0组0字面,叫做基本多语言文字面(Basic Muiti-lingual Plane,BMP),共有65534个码位,并根据不同用途分为若干区域。除BMP外的32767个字面又分为辅助字面和专用字面两部分,辅助字面用以收录IS0-10646后续搜集的各国文字,专用字面供使用者自定义收录ISO-10646未收录的文字符号。大部分用户只是用BMP字面就足够了,早期的ISO-10646标准也只要求实现BMP字面,这样只需要2字节来编码就足够了,Unicode也正是这么做的,这叫做ISO-10646编码的基本面形式,简称为UCS-2编码,UCS-2编码转换成UCS-4编码也很容易,只要在前面加两个取值为0的字节即可
  • Unicode双字节编码方式比起ISO-10646的4字节原始编码来说,在节省内存和处理时间上都具有优势,这也是Unicode编码方式更流行的原因。如果需要使用ISO-10646 BMP字面意外的文字,Unicode提出了名为UTF-16或代理法的解决方案,UTF是UCS/Unicode Transformation Format的缩写。UTF-16的解决办法是:对BMP字面的编码保持二字节不变,对其他字面的文字按一定规则将其32位编码转换为两个16位的Unicode编码,供两个字节的取值范围分别限定为0XD800~0xDBFF和0xDC00~0xDFFF,因此,UTF-16共有( 4 * 256 ) * ( 4  * 256 ) = 1048576 个码位
  • 虽然UTF-16解决了ISO-10646除BMP外第1~15字面的编码问题,但当时的计算机和网络还是ASCII的天下,只能处理单字节数据流,UTF-16在离开Unicode环境后,在传输和处理中都存在问题。于是Unicode又提出了名为UTF-8的解决方案,UTF-8按一定规则将一个ISO-10646或Unicode字元码转换成1~4个字节的编码,其中将ASCII码(0~0x7F)转换成单字节编码,也就是严格兼容ASCII字符集;UTF-8的2字节编码,用以转换ISO-10646标准0x0080~0x07FF的UCS-4原始码;UTF-8的3字节编码,用以转换ISO-10646标准0x0800~0xFFFF的UCS-4原始码;UTF-8的4字节编码,用以转换ISO-10646标准0X00010000~0001FFFF的UCS-4原始码。
  • ISO-10646只是给每一个文字符号分配了一个4字节无符号整数编号(UCS-4),并未规定在计算机中如何去表示这个无符号的整数编号。UTF-16和UTF-8就是其两种变通表示方式。
  • 现在,Unicode和ISO-10646一般指的是同一个东西
  • UTF-16和UTF-32因字节序的不同,又有了UTF-16BE(B一个Endian), UTF-16LE(Little Endian), UTF-32BE(Big Endian), UTF-32LE(Little Endian)等

 

3.汉字及一些常见的字符集

  • GB 2312-80:全称《信息交换用汉字编码字符集 基本集》,于1980年发布。根据ISO/IEC 2022提供的字符编码扩充规范,形成双字节编码的字符集。收录了常用汉字6763个和非汉字图形符号682个
  • GB13000:全称《信息技术 通用多八位编码字符集(UCS) 第一部分:体系结构与基本多文种平面》,于1993年发布、根据ISO/IEC 10646-1:1993,在CJK(中日韩简称)统一汉字区和CJK统一汉字扩充区A,除收录GB 2312-80外,还收录了第1,3,5,7辅助集的全部汉字,宫27474个,以及一些偏旁部首等。但GB13000退出后,几乎没有得到业界的支持,也就成了一个形式上的标准
  • GBK:全称《汉字内码扩展规范》 1.0版,发布于1995年。GBK在GB2312内码系统上进行了扩充,收录了GB 13000.1-1993的全部20902个CJK统一汉字,包括GB2312的全部6763个汉字。此外,他增补编码了52个汉字,13个汉字结构符(在ISO/IEC 10646.1:2000中称为表意文字描述符)和一些常用部首与汉字部件。在GBK内码系统中,GB 2312汉字所在码位保持不变,这样,保证了GBK对GB 2312的完全兼容。同时,GBK内码与GB13000.1代码一一对应,为GBK向GB 13000.1的转换提供了解决办法。有意思的是GBK并不是一个强制性的国家标准,只是一个行业指导规范,并没有强制力,但由于得到了Microsoft Windows95的支持而大为流行
  • GB 18030:全称《信息技术信息交换用汉字编码字符集、基本集的扩充》,发布于2000年。根据ISO/IEC 10646-1:2000,收录了ISO/IEC 10646.1:2000全部27848个CJK统一汉字,13个表意文字描述符、部分汉字部首和部件、欧元符号等。GB 18030采用2字节或4字节编码,其二字节编码部分与GBK保持一致,因此,GB18030SHI GBK的超集,也完全与GB 13000向上兼容,制定GB 18030也是为了解决GBK强制力不够的问题

 

常用字符集比较

字符集是否定长编码方式其他说明
ASCII单字节7位编码最早的奠基性字符集
ISO-8859-1/latin1单字节8位编码西欧字符集,经常被一些程序员用来转码
GB 2312-80双字节编码早起标准,不推荐再使用
GBK双字节编码虽然不是国标,但支持的系统不少
GB 180302字节或4字节编码开始有一些支持,但数据库支持的还少见
UTF-324字节编码UCS-4原始编码,目前很少采用
UCS-22字节编码Windows2000内部用UCS-2
UTF-162字节编码或4字节编码Java和Windows XP/NT等内部使用UTF-16
UTF-81~4字节编码

互联网和UNIX/Linux广泛支持的Unicode字符集;MySQLServer也使用UTF-8

 

 

4.选择合适的字符集

  • 对数据库来说,字符集更加重要,因为数据库存储的数据大部分都是各种文字,字符集对数据库的存储、处理性能,以及日后系统的移植、推广都会有影响
  • MySQL目前支持几十种字符集,包括UCS-2, UTF-16, UTF-16TE, UTF-32, UTF-8和utfmb64等Unicode字符集
  • 满足应用支持语言的需求,如果应用要处理各种各样的文字,或者将发布到使用不同汉语言的国家和地区,就应该选择Unicode字符集、对MySQL来说,目前就是UTF-8
  • 如果应用中涉及已有数据的导入,就要充分考虑数据库字符集对已有数据的兼容性。
  • 如果数据库只需要支持一般中文数据量很大,性能要求也很高,那就应该选择双字节定长编码的中文字符集,比如GBK。因为对UTF-8而言,GBK比较小,每个汉字只占2个字节,而UTF-8汉字编码需要3个字节,这样可以减少磁盘I/O、数据库Cache以及网络传输的时间,从而提高性能。相反,如果应用主要处理英文字符,仅有少量汉字数据,那么选择UTF-8更好,因为GBK、UCS-2、UTF-16的西文字符编码都是2个字节,会造成很多不必要的开销
  • 如果数据库需要做大量的字符运算,如比较、排序等,那么选择定长字符集可能更好,因为定长字符集的处理速度要比变长字符集的处理速度快
  • 如果所有客户端程序都支持相同的字符集,则应该优先选择该字符集作为数据库字符集,这样可以避免因字符集转换带来的性能开销和数据损失

 

5.MySQL支持的字符集简介

  • MySQL服务器可以支持多种字符集,在同一台服务器、同一个数据库甚至同一个表的不同字段都可以指定使用不同的字符集,相比Oracle等其他数据库管理系统,在同一个数据库只能使用相同的字符集,MySQL明显存在很大的灵活性。
  • 查看所有可用的字符集的命令
          SHOW CHARACTER SET
  • 显示所有的字符集和该字符集默认的校对规则
          DESC information_schema.character_set
  • MySQL的字符集包括字符集(CHARACTER)和校对规则(COLLAION)两个概念。其中字符集用来定义MySQL存储字符串的方式,校对规则用来定义比较字符串的方式。字符集和校对规则是一对多的关系,MySQL支持30多种字符集的70多种校对规则。每个字符集至少对应一个校对规则,可以用
          SHOW COLLATION LIKE '***'
        或通过表 information_schema.COLLATIONS来查看相关字符集的校对规则
    校对规则命名约定:他们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感),_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关)结束

 

6.MySQL字符集的设置

  • MySQL的字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级、字段级。他们分别在不同的地方设置,作用也不相同
  • 服务器字符集和校对规则
    服务器字符集和校对规则,可以在MySQL服务启动的确定。
        可以在 my.cnf 中设置
            character-set-server=gbk
        或者在启动选项中指定
            mysqld --character-set-server=gbk
        或者在编译时指定
            cmake . -DEFAULT_CHARSET=gbk
    如果没有特别的指定服务器字符集,那么默认使用latin1作为服务器字符集。上面3种设置的方式都只制定了字符集,没有指定校对规则,这样意味着使用该字符集默认的校对规则。如果要使用该字符集非默认的校对规则,则需要在指定字符集的同时指定校对规则。
    查询当前服务器的字符集和校对规则
        SHOW VARIABLES LIKE 'character_set_server'
  • 数据库字符集和校对规则
    数据库的字符集和校对规则在创建数据库的时候指定,也可以在创建完数据库后通过ALTER DATABASE命令进行修改。需要注意的是,如果数据库里已经存在数据,因为修改字符集并不能将已有的数据按照新的字符集进行存放,所以不能通过修改数据库的字符集直接修改数据的内容。
    设置数据库字符集的规则如下:
        如果指定了字符集和校对规则。则使用指定的字符集和校对规则
        如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则
        如果指定了校对规则但未指定字符集,则字符集使用与该校对规则关联的字符集
        如果没有指定字符集和校对规则,则使用服务器字符集和校对规则作为数据库的字符集和校对规则
    推荐在创建数据库时明确指定字符集和校对规则,避免受到默认值的影响。
    显示当前数据库默认的字符集和校对规则
        SHOW VARIABLES LIKE 'character_set_database'
        SHOW VARIABLES LIKE 'collation_database'
  • 表字符集和校对规则
    表的字符集和校对规则在创建表的时候指定,可以通过ALTER TABLE 命令进行修改,同样,如果表中已有记录,修改字符集对原有的记录并没有影响,不会按照新的字符集进行存放。表的字段仍然使用原来的字符集。
    设置表的字符集的规则
        如果指定了字符集和校对规则。则使用指定的字符集和校对规则
        如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则
        如果指定了校对规则但未指定字符集,则字符集使用与该校对规则关联的字符集
        如果没有指定字符集和校对规则,则使用数据库字符集和校对规则作为数据库的字符集和校对规则
    推荐在创建表的时候明确指定字符集和校对规则,以避免受到默认值得影响。
    显示表的字符集和校对规则
        SHOW CREATE TABLE table_name
  • 列字符集和校对规则
    MySQL可以定义列级别的字符集和校对规则,主要是针对相同的表不同字符需要使用不同的字符集情况,应该说一般遇到这种情况的几率比较小,这只是MySQL提供给我们一个灵活设置的手段。
    列字符集和校对规则的定义可以在创建表时指定,或者在修改表时调整,如果在创建表的时候没有特别指定字符集和校对规则,则默认使用表的字符集和校对规则。
  • 连接字符集和校对规则
    上面4种设置方式,确定的是数据保存的字符子和校对规则,对于实际应用访问来说,还存在客户端和服务器之间交互的字符集和校对规则的设置。
    对于客户端和服务器的交互操作,MySQL提供了3个不同的参数:
        character_set_client    客户端
        character_set_connection  连接
        character_set_results    返回结果的字符集
    通常情况下,这3个字符集应该是相同的,才可以确保用户写入的数据可以正确的读出,特别是对于中文字符,不同的写入字符集和返回结果字符集将导致写入的记录不能正确的读出。
    通常情况下,不会单个的设置这3个参数,可以通过以下命令:
        SET NAMES ***
    来设置连接的字符集和校对规则,这个命令可以同时修改这3个参数的值。使用这个方法修改连接的字符集和校对规则,需要应用每次连接数据库后都执行这个命令。
    另一个更简便的方法,是在my.cnf中设置以下语句:
        t-character-set=gbk
    这样服务器启动后,所有连接默认就是使用GBK字符集进行连接的,而不需要在程序中在执行set names命令。
    另外,字符串常量的字符集也是由character_set_connection参数来指定的
    可以通过 [_charset_name] 'string' [COLLATE collation_name] 命令强制字符串的字符集和校对规则。通常情况下,基本不需要用户强制指定字符串字符集。

 

7.字符集的修改步骤

  • 如果在应用开始阶段没有正确的设置字符集,在运行一段时间以后才发现存在不能满足要求需要调整,又不想丢弃这段时间的数据,那么就需要进行字符集的修改。
    字符集修改不能直接通过ALTER TABLE CHARACTER SET *** 或 ALTER TABLE table_name character set *** 命令进行,这两个命令都没有更新已有记录的字符集,而只是对创建的表或者记录生效。已有记录的字符集调整,需要先将数据导出,经过适当的调整重新导入后才可完成。
  • 选择目标字符集的时候,要注意最好是源字符集的超集,或者确定比源字符集的字库更大,否则如果目标字符集的字符小于源字符集的字库,那么目标字符集中不支持的字符导入后会变成乱码,丢失一部分数据。



    实例:
    模拟将latin1字符集的数据库修改成GBK字符集的数据库的过程
    1) 导出表结构
          mysqldump -uroot -p --default-character-set=gbk -d databasename > createtab.sql
            其中--default-character-set=gbk表示设置以什么字符集连接,-d表示只导出表结构,不导出数据
    2) 手工修改createtab.sql中表结构定义中的字符集为新的字符集
    3) 确保记录不再更新,导出所有记录
          mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename > data.sql
          --quick:该选项用于转出打的表。他强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行,并在输出前将他缓存到内存中
          --extended-insert:使用包括几个VALUES列表的多行INSERT语法。这样使转出文件更小,重载文件时可以加速插入
          --no-create-info:不导出每个转储表的CREATE TABLE语句
          --default-character-set=latin1:按照原有的字符集导出所有数据就,这样导出的文件中,所有中文都是可见的。不会保存成乱码
    4) 打开data.sql,将SET NAMES latin1修改成SET NAMES gbk
    5) 使用新的字符集创建新的数据库
          CREATE DATABASE database_name
          DEFAULT CHARSET charset_name
    6) 创建表,执行 createtab.sql
          mysql -uroot -p databasename < createtab.sql
    7) 导入数据,执行data.sql
          mysql -uroot -p databasename < data.sql

转载于:https://www.cnblogs.com/microcat/p/6606028.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Globalmapper中文入门到精通系列实验图文教程】(附配套实验数据持续更新)

【Globalmapper中文版入门到精通系列实验图文教程】&#xff08;附配套实验数据持续更新&#xff09; 文章目录一、专栏简介二、文章目录三、数据目录四、传送门一、专栏简介 本专栏为GlobalMapper中文入门实战精品教程&#xff0c;内容主要涉及&#xff1a;Globalmapper23软件…

【GlobalMapper精品教程】025:影像数据集的建立与巧妙使用

GlobalMapper影像数据集类似于金字塔,作用是提高大量影像的加载与显示速度,还可批量进行一系列设置。本文的配套数据为data025.rar。 文章目录 1. 建立影像数据集2. 影像数据集的使用1. 建立影像数据集 (1)点击【文件】→【创建新地图目录】。 (2)选择影像数据集存放路径…

使用xUnit为.net core程序进行单元测试(3)

第1部分: http://www.cnblogs.com/cgzl/p/8283610.html 第2部分: http://www.cnblogs.com/cgzl/p/8287588.html 请使用这个项目作为练习的开始: https://pan.baidu.com/s/1ggcGkGb 测试的分组 打开Game.Tests里面的BossEnemyShould.cs, 为HaveCorrectPower方法添加一个Trait属性…

war部署到tomcat

gs-rest-service-0.1.0.war复制到tomcat-9.0.0.M17\webapps\打开server.xml&#xff0c;这Host节点&#xff0c;加入<Context path"/gs" docBase"gs-rest-service-0.1.0.war" debug"0" privileged"true"/> gs相当于虚拟目录&…

C# Thread IsBackground作用

背景之前在做一个定时下载任务的时候&#xff0c;使用的是一个主线程在执行任务&#xff1b;后面需求调整了&#xff0c;需要在启用一个子线程执行优先级更高的单独通道下载。于是下意识的这么做 new Thread//创建后台线程Thread bThread new Thread(new ThreadStart(backgrou…

产品经理的分类及术语详解

一、按项目分类 1、前端型PM 一句话概述&#xff1a;制造口碑带来流量。 偏用户体验&运营&#xff0c;通过极致的产品设计&吸引眼球的产品营销策略&#xff0c;打造口碑&#xff0c;创造一款用户量巨大的产品。 【常见术语】 UCD&#xff08;User Centered Design…

Mybatis 拦截器

Mybatis定义了四种拦截器&#xff1a; Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSets, handleOutputParameters)StatementHandler …

1295 N皇后问题

1295 N皇后问题 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再nn的棋盘上放置n个皇后&…

CDN的强大功能

2019独角兽企业重金招聘Python工程师标准>>> CDN&#xff0c;内容分发网络&#xff0c;除了用作网站加速外&#xff0c;还能够更好的保护网站不被攻击。防护网站不被攻击的功能成就了CDN运行中的主要责任。CDN 防护原理是其主要在于在相关节点中成功的建立动态加速机…

IDEA创建SpringBoot项目无法连接https://start.spring.io(已解决)

错误&#xff1a; 方法&#xff1a; 将&#xff1a;https://start.spring.io 更换为 ​https://start.aliyun.com

论人生自动化

就像设备一样基本都是由三部分组成&#xff0c;输入&#xff0c;处理&#xff0c;输出&#xff0c;三部分。当输出与输入两者有比较&#xff0c;自然就产生了反馈&#xff0c;正反馈或者负反馈&#xff0c;有利于输出的稳定性。有一些东西或者事情能达到闭环&#xff0c;则一切…

MySQL默认数据库简介

类似于MS SQL Server等大型数据库&#xff0c;MySQL数据库也提供了内置的数据库&#xff0c;它们是&#xff1a;INFORMATION_SCHEMAmysqltest1.information_schema其中&#xff0c;第一个数据库INFORMATION_SCHEMA提供了访问数据库元数据的方式。元数据是关于数据的数据&#x…

mysql常见监控项

1、MySQL服务运行状态 约定所有MySQL服务都必须以ip1&#xff08;内网ip&#xff09;来绑定&#xff0c;每个机器只有一个ip1&#xff0c;可以有多个端口&#xff0c;即多个MySQL Server。采集程序读取ip端口信息文件来判断server是否存在。 sockParamps aux | grep -P "m…

2005年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

今天距离2024年的AMC8美国数学竞赛举办已不足一个月了&#xff0c;赶紧利用周末的时间刷刷真题&#xff0c;查漏补缺吧&#xff01;如果您有任何关于AMC8比赛的任何问题都可以问我&#xff0c;关于题目的解析也可以交流。 今天我们来看看2005年AMC8竞赛的五道典型考题。欢迎您查…

WPF效果第一百九十三篇之登录实现

前面一直在玩耍ListBox(最爱),大周末的就适合在家吹着风扇撸着代码;今天来分享一个很简单实用的登录,来看看最终实现的效果:1、关于软件启动后焦点实现:<Style TargetType"Border"><Style.Triggers><DataTrigger Binding"{Binding IsEmptyAccoun…

IDEA中安装并使用JRebel热部署插件

文章目录 作者简介引言导航热门专栏推荐概述安装JRebel注册JRebel配置JRebel最后小结导航热门专栏推荐作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步…

UWP: 实现 UWP 应用自启动

原文:UWP: 实现 UWP 应用自启动在上一篇文章中&#xff0c;我们实现了使用命令行来启动 UWP 应用&#xff0c;在这一篇文章中&#xff0c;我们会实现 UWP 应用自启用的实现&#xff0c;也即开机后或用户登陆后&#xff0c;应用自己启动。这些特性原来都是 Win32 程序所具备的&a…

选择 GCD 还是 NSTimer ?

我们常常会延迟某件任务的执行&#xff0c;或者让某件任务周期性的执行。然后也会在某些时候需要取消掉之前延迟执行的任务。 延迟操作的方案一般有三种&#xff1a; 1.NSObject的方法&#xff1a; 2.使用NSTimer的方法&#xff1a; 3.使用GCD的方法&#xff1a; 一般情况下&am…

完美解决Idea unable to access git 错误

在命令行执行 如下命令即可 git config --global --unset http.proxy git config --global --unset https.proxy

Web框架 性能评测 -- C# 的性能 和 Rust、C++并驾齐驱

自从2021年2月第20轮公布的测试以后&#xff0c;一年半后 的2022年7月19日 发布了 TechEmpower 21轮测试报告&#xff1a;Round 21 results - TechEmpower Framework Benchmarks。Techempower benchmark是包含范围最广泛的web框架性能测试&#xff0c;覆盖了比较典型的使用场景…