数据可以是数值、文字、图片以及声音、音频等各种形式的。计算机中的数据以二进制信息单元0、1表示。
计算机数据描述术语
- 位(bit): 二进制的一个单位称为位,只能是1或0。
- 字节(byte): 8个位称为一个字节,可以表示ASCII中的一字符。
- 字(word): 若干个字节组成一个字。一个字包含的二进制位数称为字长。
计算机中数据的处理
计算机中CPU与内存之间传输数据的单位是一个字长,即一个二进制位。通常称同一时间内处理字长为8位的CPU为8位CPU,依次类推32位CPU、64位CPU,也叫计算机的字长。通常这几种CPU比较普遍。对于一台16位字长的计算机,它能直接处理2的16次方内的数字,超过这个范围的数字就需要用分解的方法处理。因此64位CPU比32CPU更加优越的原因就是一次处理的数字更大,从而系统操作就减少了,系统效率也就高了。但是计算机的字长受软件系统的制约,64位的CPU在32位的操作系统上只能以32位字节运行。
字符编码
把字符集中的字符(各种文字、符号)编码为指定字符集(ASCII字符集、BB2312字符集等)的某一对象,以便计算机存储和通过通信网络传递。由于同一字符釆用不同编码方式时在计算机中的存储是不一样的,不同编码的字符在信息交换时会产生误解,所以在信息交换前要告知对方自己的编码方式,将不同编码的系统转码为统一编码方式再进行通信。
常见字符编码方式如下:
- ASCII 编码
包含内容:控制字符(回车、换行等)、可显示字符(英文大小写、阿拉伯数字和西文符号)。
7位表示一个字符,共128个字符。EBCDIC字符集使用8bit,表示256个字符。
由于ASCII 编码方式无法对几万个汉字进行编码,因此需要扩展ASCII编码。不同的国家与地区为了显示本国的语言制定了不同的标准,由此出现了GB2312、BIG5、JIS等编码。这些釆用2个字节表示一个字符延伸的编码方式叫 ANSI 编码。在简体中文系统中,ANSI编码代表GB2312编码,日文操作系统中ANSI编码代表JIS编码。不同ANSI编码之间互不兼容,因此 Unicode 码诞生了。每个语言下的ANSI编码都有一套一对一的编码转换器,Unicode 变成所有编码转换器的中间介质。这样所有编码通过转换器可以转码到Unicode,而Unicode 也可以转到其他编码上。
- GB2312 编码 — 简体中文字符集,双字节。这种编码仅在中国行的通。编码范围:A1A1—FEFE
包含内容:简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母、共7449个图形字符。对于人名、古汉语出现的罕见字不能处理,从而导致GBK、GB18030字符集的出现。Windows3.2 如苹果OS以GB2312为基本编码,有些繁体字符用拼音或五笔打不出来时需要调出GBK字符集才可以打出该字。Windows98、95系统以GBK为基本编码。
分区表示:共94个区
1) 01-09: 除汉字外682个特殊字符
2) 10-15: 空白区末使用
3) 16-55: 收录3755个一级汉字,按拼音排序
4) 56-87: 收录3008个二级汉字,按笔画/部首排序
5) 88-94: 空白区未使用
双字节编码:第一个字节(高字节)对应94个区,第二个字节(低字节)对应94个位。所以它的区域码范围是0101—9494,区号与位号分别加上0xA0就是GB2312编码。
例如,最后一个区位码位是9494,即十六进制5E5E。0x5E + 0xA0 = 0xFE ,所以该码位的GB2312编码是FEFE
因此GB2312编码范围是:A1A1—FEFE ,其中汉字编码范围是:高字节(0xB0—0xF7,对应区号16—87)、低字节(0xA1—0xFE,对应位01—94)
- GBK 编码— 双字节编码,编码范围:8140—FEFE,首字节81——FE,尾字节40——FE,剔除XX7F一条线。共23940个码位。
兼容GB2312,支持GB13000.1中的全部中日韩汉字,并包含了BIG5中全部汉字。共收录汉字与图形符号21886个,其中21003个汉字、883个字符,并提供1894个造字码位,简、繁字容为一库
釆用单双字节变长编码,英文使用单字节编码,完全兼容ASCII编码(00-7F范围内是一位,严格来说有96个字符+32个控制符号),中文采用双字节编码(第一字节81——FE,第二字节的一部分领域在40——7E,其他领域在80——FE)。
全部编码分为三大部分:
1) 汉字区:
a. GB2312汉字区,即GBK/2:BOA1——F7FE。收录GB2313汉字6763个,按原顺序排列
b. GB13000.1扩充汉字区。包含:
b1:GBK/3:8140——A0FE。收录GB13000.1中的CJK(中国、日本、朝鲜)汉字6080个。
b2:GBK/4:AA40——FEA0。收录CJK汉字和增补的汉字8160个。CJK汉字在前,按照UCS代码(Unicode在编码上与UCS保持一致,在实现上有自己的规则。而UCS只定义了编码标准。Unicode的实现形式上有UTF-8、UTF-16、UTF-32还有UTF-7等)大小排列;增补的汉字(包括部首和构建)在后,按照<<康熙字典>>的页码.字位排列。
b3:汉字"〇"安排在图形符号区GBK/5:A996
2) 图形符号区
a. GB2312 非汉字符号区。即GBK/1:A1A1——A9FE。其中除GB2312的符号外,还有10个小写罗马数字和GB12345增补的符号。共计符号717个。
b. GB13000.1 扩充非汉字区。即GBK/5:A840——A9A0。BIG-5非汉字符号、结构符和“〇”。共计符号166个。
3) 用户自定义区:分为三个小区——(AAA1——AFFE:564个码位)、(F8A1——FEFE:658个码位)、(A140——A7A0:672个码位,该区虽对用户开放但是限制使用。不排除未来在此区域增补新字符的可能)
- BIG-5编码 —— 两个字节存储表示。编码范围:8140——FEFE,其中汉字编码范围:A440——F9DC。高位字节使用0x81——oxFE,低位字节采用0x40——0x7E 以及 0xA1——0xFE
是台湾、香港、澳门地区使用繁体中文字符集。其中繁体汉字13053个,808个标点符号、希腊字母以及特殊符号。
- Unicode —— 字符码表
Unicode 是一种编码方案,为每种语言中的每一个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行转处理的要求。虽然统一了编码方式但是它的效率并不高,因为它占用的内存空间会比较大。因此针对不同情况需要选用合适的编码方式。Unicode编码有三种具体实现,分别为 UTF-8(占用1—4个字节)、UTF-16(占用二或四个字节)、UTF-32(占用4个字节)。
- UTF-8 编码 —— 使用1——4个字节为每个字符编码。是为了提高unicode编码效率,因为它可以根据不同符号自动选择编码的长度。比如英文字母只用一个字节。
针对Unicode的一种可变长度字符编码。可以用来表示Unicode标准中的任何字符。
1) US-ASCII字符只需要一个字节编码 (Unicode 范围为U+0000——U+007F)
2) 带有变音符号的拉丁文、希腊文、西里尔字母等需要2个字节编码(Unicode 范围为U+0080——U+07FF)
3) 其他语言的字符(包括中日韩文字、东南亚文字、中东等文字)包含了大部分常用字,使用3字节编码
4) 其他极少使用的语言字符使用4字节编码
注:UTF-16 用两个字节表示一个字符,但是有很大一部分字符用一个字节就可以表示,若用两个字节表示就加大了存储空间的开销,这样就会增加网络传输的流量,因此大部分情况下采用UTF-8。对于需要支持表情符号的情况采用 utf8mb4 字符集编码
- Base64 编码
Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码就是就是从二进制到字符的过程。
作用:比如邮件系统中的中、日文不能被服务器、网关有效处理,这时就需要把由其他编码存储的符号转换成ASCII码来进行传输。比如在一端发送GBK编码—>通过Base64规则—>转换成ASCII码,接收端收到ASCII码—>根据Base64规则—>还原到GBK
Mysql 中字符集
使用mysql时需要注意6个地方的编码:系统、客户端编码、服务器、库、表、列的编码。Mysql 默认字符集 latin1 —— 单字节编码,有些国家的字符不能显示需要用UTF-8字符集。