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

俊达1年前技术文章509

字符和编码

  • 字符

字符是符号,是人们用于交流的各类符号,如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运维实战(5.5) 数据导入导出时的字符集问题

mysql可以使用load data/select into outfile或mysqldump工具进行数据导入导出。下面分别分析数据导入导出时的字符集相关问题。准备测试数据创建测试表,2个字段分别使...

MySQL运维实战(5.2) MySQL charset基本概念

mysql多字符集mysql支持多字符集。一个数据库中可以存储不同字符集的数据,一个表的不同字段可以使用不同的字符集。mysql> show character s...

MySQL运维实战(5.3) MySQL数据乱码的一些情况

MySQL运维实战(5.3) MySQL数据乱码的一些情况

表数据乱码当数据的真实编码和相关参数(常见的包括character_set_client, character_set_result, 字段的编码,终端的编码)不一致时,会产生乱码。测试1 - 表中的...

MySQL运维实战(5.4) MySQL元数据乱码

表结构Comment乱码如果DDL实际编码和character_set_client设置不一致,也会引起乱码。$ cat test_comment_utf8.sql create...

MySQL运维实战(5.6) 字符集设置对mysqldump的影响

mysqldump不指定字符集不指定字符集时,默认使用了utf8。可能和环境有关系。mysqldump -uroot test test_load >&n...

发表评论    

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