Oracle data types

这一章介绍的是oracle内置的数据类型,它们的属性,还有它们如何映射到非oracle数据类型中。



Oracle数据类型的介绍

SQL语句中的每一行的值和常数都有一个数据类型,他们和特定的存储格式,约束和值的范围有关系。

你创建一个表的时候,必须要给每一行都制定一个数据类型。


字符型数据类型


字符型数据类型把字符存储在字符串中。

Oracle内部的字符集在创建数据库的时候已经确定。



CHAR数据类型

CHAR数据类型存储的是固定长度的字符串。你创建一个CHAR行,必须要制定一个字符串的长度(以byte或者字符)长度是在1-2000byte。默认是1byte

Oracle规定:

插入或者update表里的一行时,char行有固定的大小。

如果你插入一个shortervalue,这个值会使用blank-padded到固定的大小。

如果值太大,oracle database会返回错误。



VARCHAR2VARCHAR数据类型


VARCHAR2数据类型存储存储可变长度的字符串。创建一张表,表里有个varchar2格式的行,你必须确定最大的字符串长度(bytes,或者character1-4000.每一行,oracle database把每一行的数据存储成为可变大小的,除非长度超过字段的最大长度,超过字段的最大长度之后,oracle会返回error。使用varchar2varchar可以节省表的存储空间。

比如:你声明了一个字段最大长度50,如果只有10个字符插入到这个字段中,这个字段只存储10个字符,而不是50个。




VARCHAR数据类型

Varchar数据类型和varchar2是同义词。为了避免改变,通常我们使用VARCHAR2


Single-byte:单字节。Multiple-byte:多字节

英文字母属于单byte字符,汉字属于多byte字符。

单字节:byte 比特是最小的数值单位:bit

Bitbyte的关系:

Bit:binary digit:二进制数字,二进制数字



字符数据类型的长度语义

全球化支持允许不同种类的字符集对应字符数据类型。全球化支持让你可以处理单字节和多字节字符数据,而且可以在字符集之间做自由转变。客户端会话可以使用和database字符集不同的客户端字符集。


当你指定字符数据类型的字段长度的时候,考虑一下字符的大小。一张表的字段存储有字符数据的时候,你预估这张表的存储空间的时候,必须要考虑这个问题。



字符数据类型的长度语义可以使用bytes或者字符来衡量。

字节语义把字符串当做一个bytes的序列。这是字符数据类型默认的。

字符语义把字符串当做一个字符的序列,一个字符在技术角度而言是一个database字符集的编码点。



对于单字节的字符集,字符语义定义的字段和bytes语义定义的一样。字符语义和



























数字数据类型

数字数据类型存储正,负,确定的和浮点型数字,0infinity和不确定的操作结果的值。

包括以下的值:



数字数据类型


数字数据类型存储固定的和浮点型数字。实际上任何量级的数字都可以被存储,可以在不同的运行oracle database的操作系统上相互移植,最大精度可以到到38位。



下面的数字可以被存储在一个NUMBER的字段中:


1 x 10-130 to9.99...9 x 10125范围的正数,最大精度可以到达38

1 x 10-130 to9.99...9 x 10125范围的负数,最大精度可以到达38

0

正无穷和负无穷。

数字类型的字段,你可以指定这一行:column_name,NUMBER

或者,你可以制定一个精度和scale(小数点右边的数字位数)

Column_nameNUMBER(precision,scale)

如果precision没有被指定,字段会以源数据来存储,如果scale没有指定,scale就是0.

Oracle保证了一个精度在38以内的数据可移植性。你可以制定一个scale和没有precision

Column_nameNUMBER(*,scale),这个是:精度是38位,指定的scale是可以获得的。

当你指定数字的时候,同时制定规模和精度是件好事,可以在数据输入的时候进行更细致的检查。

下表显示的是:插入数字的信息和数字的格式设定作用之后的结果

142323671.jpg



内部数字格式


Oracle database存储数字以一个可变的长度,每一个值都存储在一个科学的符号,1byte来存放指数,20bytes以上来存放尾数,结果的值是限定在38位,oracle database不会存储开头和结尾的0,比如4124.12 x 102                      ,用一个字节来存放指数2,另外两个字节存放412。负数的话存放在他们的长度中存放负号。


综上所述:字段的字节长度是由一个值决定的NUMBER(p)p是所给值的precision,是通过以下的值来计算的:

ROUND((length(p)+s)/2))+1

如果数字是正,s=0,如果s是负数,s=1.

0,正无穷和负无穷是通过独有的表示来存储的,0和负无穷需要1bytes,正无穷需要2bytes




浮点型数字