不同的字符集在速度和字符量方面上的区别

ASCII(8位)

表示方法

总共128个字符,包括32个不能打印出来的控制符号
最高位统一规定为0

Unicode

表示方法

每一个符号都给予一个独一无二的编码。
现有规模可容纳100多万个符号
Unicode只是编码方案,未规定这个二进制代码应该如何存储

字符数量

100w+

UTF-8(是Unicode的实现方式之一,变长,1-4字节)

表示方法

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

以汉字“茅”(Unicode: 8305)举例。
8305用二进制表示是
1000 0011 0000 0101
位于第三行的范围,因此其编码为
11101000 10001100 10000101

UTF-8最多可以表示21位长的Unicode。

速度方面的优势

如果应用主要处理英文字符,仅有少量汉字数据,那么选择UTF-8更好,因为GB2312/UCS-2/UTF-16的英文字符编码都是2个字节。

UCS-2

编码方式

是真正的等宽编码,每个字符都使用两个字节。
UTF-16是UCS-2的超集,实际情况常常把UTF-16当做UCS-2的别名。

速度方面的优势

在字符串截断和计算字符数量时很有用

GB2312(16位)

表示方法

区位码:每一个字符都有对应一个编号。其中前两位为“区”,后两位为“位”。中文汉字的编号区号是从16开始的,位号从1开始。
GB2312编码基于区位码,用双字节编码表示中文和中文符号。一般的编码方式是 0xA0+区号,0xA0+位号。
例如“茅”的GB2312编码为"C3A9",那么区号是0xC3-0xA0=0x23=35, 位号是0xA9-0xA0=9,即这个字在35区9位。

区号
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。

字符数量

GB2312基本集共收入汉字6763个和非汉字图形字符682个。

速度方面的优势

由于GB2312是定长的,因此在数据库需要做大量的字符运算(比较、排序)等情况下,定长字符集更有优势。
如果数据库只支持一般中文,数据量很大,性能要求也很高,那就应该选择双字节长编码的中文字符集,这样可以减少磁盘I/O,数据库Cache以及网络传输的时间。

GBK

表示方法

GBK编码兼容ASCII和GB2312,相对于GB2312而言补充了大量汉字。但区位码并没有更新,也就是说补充的字符在区位码表里还是没有。
全角字符的“2”和半角字符的“2”在GBK中编码不同,前者是0xA3 0xB2,后者是0x32
因此GBK为不定长编码。

字符数量

GBK编码标准bai兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位。

Unicode处理大端法和小端法

Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。

如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

数据库建表时如何选择编码类型?

为列选择最小化的数据类型
如果一列中的文本长度不一,使用VARCHAR而不是CHAR
不存储Unicode不要使用NVARCHAR或者NCHAR
如果一行的长度不超过8000,使用VARCHAR而不是TEXT
对于仅存数字的列要使用数字类型而不要用字符类型
不要使用字符串类型存储日期数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值