概述
明天主要阐述下Oracle数据库底层储存--字节序和字符集,下边一上去瞧瞧吧~
1、字节序
Oracle安装在不同的服务器构架平台,数据文件所采用的字节序也不相同。字节序有两种linux软件下载,BigEndian和LittleEndian。例如通常我们Windows或则Linux服务器用的CPU是Intel/AMD构架,这么数据文件保存格式为LittleEndian,假如用的是IBM的PowerPC,这么数据文件保存格式为BigEndian。
BigEndian和LittleEndian具体在保存数据时有哪些区别呢?我们举例说明。
整数1920假如用4个字节(十六补码0X00000780)保存,这么在BigEndian的保存方式如下表所示。
我们再来看看LittleEndian的保存方式。
按照前面的内容,我们可以晓得在LittleEndian下,保存整数1920是反向的
以下列举各个服务器平台的ENDIAN格式。
2、字符集
计算机曾经发明时大多拿来处理数字,后来渐渐的拿来处理文字。问题来了,计算机可不认识全世界那么多文字,甚至连26个英语字母也不认识。于是澳洲国家标准商会ANSI开始制做标准,例如用65表示字母A,用66来表示字母B,包括26个大小写字母,数字和一些符号(100多个),这就是最初的ASCII码。曾经ASCII码没有超过128个,只用了7位来表示,最低位留给用作奇偶校准。后来又被法国扩充到了8位,可以拿来表示256个字符。
ASCII码并没有包括英文,要让计算机认识英文,中国的标准化机构也开始制做了一些标准(GBK)。中国的汉字太多了嵌入式linux,用一个字节可装不下那么多(8个二补码位最多表示256个字符),于是采用了2个字节(理论上可以表示65536个字符),其他国家和地区也没有闲着,例如美国的Shift_JIS编码,台湾日本的BIG5编码,于是全世界形成了各类各类的字符编码。
这样问题又来了,并且是大问题。你们都各搞各的,那么多编码,自己本地传输信息其实没有问题。并且当一个中国人发GBK编码的英文电邮给德国人,德国人的笔记本若果只认识Shift_JIS编码,这么计算机将会把所有GBK编码依照Shift_JIS编码来解释linux 中文字符集,于是德国人看见的是所谓的“乱码”。之所以叫所谓,由于计算机自觉得它并没有做错,这些“乱码”也是对应的字符,只是不常用,台湾人看不懂而已,计算机懂的。
于是月球上的标准化组织领导们又开会讨论了,还提出了一个伟大的看法,这就是UNICODE字符集。这些字符集的看法是用一套字符集把月球上所有的文字都包括进来。其实2个字节可装不下全世界的所有字符,采用了4个字节(理论上可以表示4294967296个字符)。用UNICODE字符集实现的编码有UTF32/UTF16/UTF8。
里面扯了如此多,这么我们在新建数据库的时侯,须要选择数据库的数据库字符集(CHARACTERSET)和国家字符集(NATIONALCHARACTERSET)。例如我们选择数据库字符集为ZHS16GBK,国家字符集为AL16UTF16。它表示这个数据库里Char,Varchar2采用的是GBK的编码,而Nchar,Nvarchar2,Nclob采用UTF16编码。
好,下边我们来做一个试验,瞧瞧那些字符集里究竟保存了哪些内容。
SQL> SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%'; SQL> CREATE TABLE TESTCHAR (COL1 VARCHAR2(100),COL2 NVARCHAR2(100)); SQL> INSERT INTO TESTCHAR VALUES('DBSEEKER+广东省广州市','DBSEEKER+广东省广州市'); SQL> SELECT DUMP(COL1,16),DUMP(COL2,16) FROM TESTCHAR;
在前面我们新建一张表,表有两个数组,COL1的数组类型为VARCHAR2使用的是数据库字符集(ZHS16GBK)linux 中文字符集,COL2的数组类型为NVARCHAR2使用国家字符集(AL16UTF16)。往两个数组插入了同样的文本内容'DBSEEKER+四川省重庆市'。
接出来,我们DUMP了数组保存的十六补码内容,观察到主键COL1的宽度为21个字节,而数组COL2的宽度为30字节,为何同样的文本内容保存在VARCHAR2和NVARCHAR2上面,底层的储存内容完全不同呢?
诱因就在于COL1和COL2使用了不同的字符集,不同字符集对应相同文字编码定义也是不一样的。
COL1使用GBK编码,各个字节对应的字符。
COL2使用UTF16编码,各个字节对应的字符。
通过里面观察,我们可以晓得GBK编码是变长的,英语字母用1个字节保存,汉字用2个字节来保存。而UTF16则都是用2个字节来保存。Oracle数据文件里保存的文本数组内容就是各类编码表相对应的字符编码。
理解那些内容,对于分析数据块是有很大帮助的。前面会分享更多devops和DBA方面的内容,感兴趣的同学可以关注一下~