Oracle data types
这一章介绍的是oracle内置的数据类型,它们的属性,还有它们如何映射到非oracle数据类型中。
Oracle数据类型的介绍
SQL语句中的每一行的值和常数都有一个数据类型,他们和特定的存储格式,约束和值的范围有关系。
你创建一个表的时候,必须要给每一行都制定一个数据类型。
字符型数据类型
字符型数据类型把字符存储在字符串中。
Oracle内部的字符集在创建数据库的时候已经确定。
CHAR数据类型
CHAR数据类型存储的是固定长度的字符串。你创建一个CHAR行,必须要制定一个字符串的长度(以byte或者字符)长度是在1-2000byte。默认是1byte。
Oracle规定:
插入或者update表里的一行时,char行有固定的大小。
如果你插入一个shorter的value,这个值会使用blank-padded到固定的大小。
如果值太大,oracle database会返回错误。
VARCHAR2和VARCHAR数据类型
VARCHAR2数据类型存储存储可变长度的字符串。创建一张表,表里有个varchar2格式的行,你必须确定最大的字符串长度(bytes,或者character)1-4000.每一行,oracle database把每一行的数据存储成为可变大小的,除非长度超过字段的最大长度,超过字段的最大长度之后,oracle会返回error。使用varchar2和varchar可以节省表的存储空间。
比如:你声明了一个字段最大长度50,如果只有10个字符插入到这个字段中,这个字段只存储10个字符,而不是50个。
VARCHAR数据类型
Varchar数据类型和varchar2是同义词。为了避免改变,通常我们使用VARCHAR2。
Single-byte:单字节。Multiple-byte:多字节
英文字母属于单byte字符,汉字属于多byte字符。
单字节:byte 比特是最小的数值单位:bit。
Bit和byte的关系:
Bit:binary digit:二进制数字,二进制数字
字符数据类型的长度语义
全球化支持允许不同种类的字符集对应字符数据类型。全球化支持让你可以处理单字节和多字节字符数据,而且可以在字符集之间做自由转变。客户端会话可以使用和database字符集不同的客户端字符集。
当你指定字符数据类型的字段长度的时候,考虑一下字符的大小。一张表的字段存储有字符数据的时候,你预估这张表的存储空间的时候,必须要考虑这个问题。
字符数据类型的长度语义可以使用bytes或者字符来衡量。
字节语义把字符串当做一个bytes的序列。这是字符数据类型默认的。
字符语义把字符串当做一个字符的序列,一个字符在技术角度而言是一个database字符集的编码点。
对于单字节的字符集,字符语义定义的字段和bytes语义定义的一样。字符语义和
数字数据类型
数字数据类型存储正,负,确定的和浮点型数字,0,infinity和不确定的操作结果的值。
包括以下的值:
数字数据类型
数字数据类型存储固定的和浮点型数字。实际上任何量级的数字都可以被存储,可以在不同的运行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是可以获得的。
当你指定数字的时候,同时制定规模和精度是件好事,可以在数据输入的时候进行更细致的检查。
下表显示的是:插入数字的信息和数字的格式设定作用之后的结果
内部数字格式
Oracle database存储数字以一个可变的长度,每一个值都存储在一个科学的符号,1byte来存放指数,20个bytes以上来存放尾数,结果的值是限定在38位,oracle database不会存储开头和结尾的0,比如412是4.12 x 102,用一个字节来存放指数2,另外两个字节存放412。负数的话存放在他们的长度中存放负号。
综上所述:字段的字节长度是由一个值决定的NUMBER(p),p是所给值的precision,是通过以下的值来计算的:
ROUND((length(p)+s)/2))+1
如果数字是正,s=0,如果s是负数,s=1.
0,正无穷和负无穷是通过独有的表示来存储的,0和负无穷需要1bytes,正无穷需要2bytes。
浮点型数字