编码集的二三事(通俗理解版)

字符集

写过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和vachar2

区别

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类型,因为毕竟省空间

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值