MySQL运维实战(5.1) 字符和编码的基本概念

俊达2年前技术文章908

字符和编码

  • 字符

字符是符号,是人们用于交流的各类符号,如26个英文字母、汉字、标点符号、数学运算符、其他语言的字母和符号。

  • 编码

编码是计算机中以二进制方式存储字符的方式。

  • 字符集

字符集是字符和编码的映射表。如何将字符以二进制的方式存储,以及如何将二进制数据还原成人们认识的符号(字符),字符集起了关键的作用。


常见的字符集

ascii

单字节。使用00~7F,总共128个字符。

ascii.png

GBK

1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。

GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。

gbk编码表可以从网上找到,如:https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php


下图是部分汉字的GBK编码:


gbk.png



Unicode

Unicode(统一码)是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode的编码方式

utf8

使用变长的方式编码unicode字符。使用1-4个字节来编码。

utf8.png


汉字使用UTF8编码占用3个字节。




一些例子


我们可以借助Python(这里用的是python 2.7),方便地观察字符的编码和解码。


汉字“中国”的GBK编码是 D6D0 B9FA

>>> u"中国".encode('gbk')
'\xd6\xd0\xb9\xfa'


汉字“中国”的UTF8编码是 E4B8AD E59BBD

>>> u"中国".encode('utf8')
'\xe4\xb8\xad\xe5\x9b\xbd'


汉字“中国”的Unicode是 4E2D 56FD

>>> u"中国"
u'\u4e2d\u56fd'


数据E4B8ADE59BBD以UTF8编码解码,得到汉字字符“中国”的Unicode

>>> '\xe4\xb8\xad\xe5\x9b\xbd'.decode('utf8')
u'\u4e2d\u56fd'


数据E4B8ADE59BBD以GBK编码解码:

-- ADE5不是合法的GBK编码,默认情况下报错
>>> '\xe4\xb8\xad\xe5\x9b\xbd'.decode('gbk')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence


-- 忽略解码时的错误,得到3个Unicode字符
>>> '\xe4\xb8\xad\xe5\x9b\xbd'.decode('gbk', errors='replace')
u'\u6d93\ufffd\u6d57'


-- 看起来像乱码。其中”?“是因为GBK无法解码ADE5,使用默认字符替换得来。
>>> print u'\u6d93\ufffd\u6d57'
涓�浗


产生乱码的一个原因是解码时使用的字符集不对。













相关文章

MySQL优化器特性(四)表关联之BNL(Block Nested Loop)和Hash Join

MySQL优化器特性(四)表关联之BNL(Block Nested Loop)和Hash Join

什么是BNLMySQL表关联时,如果关联条件上没有合适的索引,则join时,对于驱动表的每一条记录,都需要全表扫描被驱动表。如果驱动表有多条数据,则需要多次全表扫描被驱动表,查询性能很差。对于这种情况...

MySQL运维实战(2.3)MySQL的权限体系和一个例子

mysql权限按授权范围分为3大类全局权限。全局权限是用于管理系统模块的权限。跟具体的数据库或对象无关。授权时需要指定为*.*数据库权限对象权限对于具体的数据库对象的权限,如表、字段级别的权限。MyS...

MySQL运维实战之备份和恢复(8.1)xtrabackup全量备份

xtrabackup是percona开源的mysql物理备份工具。xtrabackup 8.0支持mysql 8.0版本的备份和恢复。xtrabackup 2.4支持mysql 5.7及以下版本的备份...

MySQL运维实战(2.2)忘记密码如何处理

如果忘记了一个普通用户的密码,可以使用管理员账号登录,修改其他用户的密码。但是如果所有管理员账号的密码都忘记了,应该怎么处理呢?如果忘记root密码,可以使用skip-grant-tables参数启动...

MySQL运维实战(4.7) SQL_MODE之ANSI_QUOTES

默认情况下,mysql使用反引号(`)作为标识符的引号。使用mysql关键字作为表名、字段名会报语法错误,这时可以加上反引号( `),避免报错。设置ANSI_QUOTES后,使用双引号(")...

MySQL运维实战之ProxySQL(9.1)ProxySQL介绍

MySQL运维实战之ProxySQL(9.1)ProxySQL介绍

mysql通过复制技术实现了数据库高层面的可用,但是对于应用来说,当后端MySQL发生高可用切换时,应该怎么处理?我们考虑几种方案:1、使用域名绑定。应用通过dns连接后端实例,当后端发生切换后,将d...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。