字符集
写过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类型,因为毕竟省空间