编码集的二三事(通俗理解版)
发布日期:2021-05-16 13:53:07 浏览次数:12 分类:精选文章

本文共 1344 字,大约阅读时间需要 4 分钟。

文章目录

字符集

写过C语言的大概都遇到过编译报错“烫烫烫烫”的绝望时刻。

年幼无知的我,还以为是电脑温度太高,程序被“烫”着了。

再回首,觉得自己实属憨憨。

简单的来说,我们看到的输出在屏幕上的字符,在背后实质是编号,类似于字典,每个字都有一个编号。

计算机由美国人发明,人家也就顺带创了自己的编码集ASCII码

ASCII 以8位二进制标识了128个字符,这128个字符中包括全部的26个英文字母和0-9数字以及一些符号等。也就是意味着英文字符的长度是1个字节。

英文就26个字母,编码起来自然容易些。

可中国地大物博,文字历史源远流长,就光日常的用字都在6000左右,1个字节实属杯水车薪,然后中国就做了自己的编码集GBK、GBK2312编码集(GBK是GBK2312的超集,向下兼容GBK2312),GBK中每个字用2个字节标识,也就是16bit。

这虽然解决了汉字的编码问题,但是呢,当其它国家的编码集和我们使用的不一样时,就出现了问题。

同一个编号,在GBK中显示的是“赵”,在其它编码集中就有可能是“烫”,也就解释了在C语言中出现“烫”字样的原因,就是编码集不同。

这个问题一出,就有小机灵说:“那没事,我们发明一个综合的编码集,把所有国家的文字都进行编码,大家统一用这一个编码集就没事了”。

于是出现了Unicode(俗称万国码),万国码里所有的文字都用3个字节表示,且每个文字的编号唯一,看起来像是解决了问题。

但事实是,并没有!!!

一方面世界上那么多国家,每个国家那么多文字,3个字节也不足以表示全部。

另一方面,我要是通篇英文,原本每个字符用1个字节即可,现在需要用3个字节,非常浪费空间。

有问题我们就解决问题,因此UTF-8(将Unicode看作一个类,那么UTF-8可以看作是类的一个对象)出现了,该字符集定义所有ASCII码中的字符,依然用1个字节表示,中文呢,编码比较靠后,用3个字节表示,也就解决了空间浪费问题。

Oracle中的char和varchar2

区别

char和varchar2都是Oracle的字符类型。

char 是定长的, varchar2是不定长的

用个比喻

char是一个瓶子,不管你装与不装,它的空间大小是一定的。

varchar2是一个袋子,它提供了一个最大的空间,但你可以选择实际它装的空间。

举个例子

定义char(20) 和 varchar2(20)

使用char来存储“abc" ,虽然”abc"只有3个字节,但它却占据了20个字节的空间,其余17个字节都存储着空字符(即空格)。

使用varchar2来存储“abc",varchar2可以提供20个字节的大小,但”abc"只占据3个字节,那其余17个存储空间就是空着的,没有存储任何其它东西。

适用范围

char是以空间换时间,虽然占据的空间多,但是呢,数据传递速率快。

varchar2是以时间换空间,虽然占据的空间少,但是它处理的慢。

世上总没有两全其美的事情,所有我们在使用时只能进行取舍。

当字段存储值的长度相差不大时,我们选择char类型, 比如存储值之间相差1-2个字节这种。

当字段存储值长度相差较大时, 选择varchar2类型,因为毕竟省空间。

上一篇:Oracle的一些常用函数
下一篇:Linux-用户和组账户管理(不知道是不是史上最全)

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月30日 19时01分07秒