Oracle数据库常用数据类型
Oracle数据类型很丰富,官方文档https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT012 ,在此选择常用的简要总结介绍。
字符数据类型
字符串、文本
☆Char
定长格式字符串,在数据库中存储时不足位数填补空格,它的声明方式如CHAR(size),size为字符串长度,可指定一个1-2000字节之间的值作为CHAR的宽度(以字节或字符为单位)。默认(缺省)值为1字节
不建议使用,会带来不必要的麻烦:
a、字符串比较的时候,如果不注意(char不足位补空格)会带来错误
b、字符串比较的时候,如果用trim函数,这样该字段上的索引就失效(有时候会带来严重性能问题)
c、浪费存储空间(无法精准计算未来存储大小,只能留有足够的空间;字符串的长度就是其所占用空间的大小)
☆Varchar2 / Varchar
注意:varchar是被废弃的类型,oracle目前都推荐使用varchar2。
用于保存变长的字符串数据。它的声明方式如Varchar2 (size),其中最大字节长度由(size)指定。每行长度可变,最大长度为每行4000字节,没有缺省值。
设置长度(size)前需考虑字符集为单字节或多字节。由于VARCHAR2数据类型只存储为该列所赋的字符(不加空格),所以VARCHAR2需要的存储空间比CHAR数据类型要小。
注意:varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节;
当语言环境为中文(SIMPLIFIED CHINESE_CHINA.ZHS16GBK)时,一个VARCHAR2(200)的数据列可以保存200个英文字符或者100个汉字字符。
VARCHAR2把空串等同于null处理,而varchar仍按照空串处理;大部分情况下建议使用varchar2类型,可以保证更好的兼容性。
大对象类型(Large Objects)
包括BLOB、 CLOB、 NCLOB和BFILE。它们允许你存储和可操作大型非结构化的数据,例如图片、文本、视频、声音等等。
☆BLOB类型
BLOB类型在数据库中存储非结构化的二进制数据,最多可以存储128T的二进制数据。
☆B CLOB和NCLOB类型
CLOB和NCLOB类型可以储存最多128T的字符数据。CLOB储存数据库字符集的数据,而NCLOB存储Unicode字符集数据。
☆B BFILE类型
BFILE类型存储在数据库之外的非结构化的二进制数据。BFILE数据存储了指向外部文件的文件定位符。可以存储的BFILE数量手操作系统的限制。另外,BFILE是只读的。
数值类型
数值类型可以保存正负定点数和浮点数、零、无穷大和未定义的操作结果(例如非数字NaN)。
☆NUMBER类型
NUMBER类型用于存储定点数和浮点数,可以保存几乎任意大小(38位精度)的数值并在不同版本的Oracle数据库中通用。
你可以选择指定NUMBER类型精度和数值范围:
column_name NUMBER (precision, scale)
如果precision(精度)没有指定,那么数据库会按照给定的值保存数值。如果scale(数值范围)没有指定,数值范围就是0。Oracle保证精度小于等于38位的数值的可移植性。可以将精度指定为*,这种情况下精度是38位,数值范围仍然是给定的。如下:
column_name NUMBER (*, scale)
下面的表格展示了数值范围是如何影响数据存储的,以输入7,456,123.89为例:
指定为 |
存储为 |
NUMBER |
7456123.89 |
NUMBER(*,1) |
7456123.9 |
NUMBER(9) |
7456124 |
NUMBER(9,2) |
7456123.89 |
NUMBER(9,1) |
7456123.9 |
NUMBER(6) |
not accepted, exceeds precision(不认可,越出精度) |
NUMBER(7,-2) |
7456100 |
☆浮点数类型
Oracle数据库专门为浮点数提供了两种数据类型,BINARY_FLOAT和BINARY_DOUBLE。它们支持所有NUMBER提供的基本功能。并且由于NUMBER使用十进制精度,BINARY_FLOAT和BINARY_DOUBLE使用二进制精度,这为它们提供了更快的数值计算速度并常常减少了存储需求。
BINARY_FLOAT和BINARY_DOUBLE是近似的数值类型。它们储存了十进制数值的近似表示,而不是精确表示。例如,十进制数0.1不能精确的表示成BINARY_FLOAT或者BINARY_DOUBLE。它们经常用来进行科学计算,在行为上和Java以及XML Schema中的FLOAT和DOUBLE相似。
BINARY_FLOAT
BINARY_FLOAT是32位单精度浮点数类型,需要占用5个字节的存储空间,包括一个长度字节。
BINARY_DOUBLE
BINARY_DOUBLE是64位双精度浮点数类型,需要占用9个字节的存储空间,包括一个长度字节。
值 BINARY_FLOAT BINARY_DOUBLE
最大正值 3.40282E+38F 1.79769313486231E+308
最小正值 1.17549E-38F 2.22507485850720E-308
日期和时间类型
日期时间类型包括DATE,TIMESTAMP,TIMESTAMP WITH TIME ZONE,TIMESTAMP WITH LOCAL TIME ZONE。时间间隔类型包括INTERVAL YEAR TO MONTH和INTERVAL DAY TO SECOND两种。
☆DATE类型
DATE类型存储了日期和时间信息。对于每个DATE类型的值,Oracle存储了以下信息:世纪、年、月、日、时、分、秒。可以为DATE类型的值指定字面值,也可以使用TO_DATE函数将一个字符或者数值转换成DATE类型。
☆TIMESTAMP类型
TIMESTAMP数据类型是DATE类型的扩展。它存储了年、月、日,加上时、分、秒。这个数据类型在储存精确的时间值时很有用。
rowid类型
Oracle数据库中每个表的每行记录都有一个存储的物理位置,即表的rowid伪列,采用rowid作为where条件的访问效率最高。
rowid的访问效率虽然是最高的,但是,在实际应用中要谨慎,需要注意两个问题:
(1)rowid存放的是表记录的物理位置,在数据整理、数据备份和迁移的时候,记录的物理位置会发生改变;
(2)rowid是Oracle数据库专有的数据类型,与其它的数据库不兼容。
Oracle还提供用户自定义的数据类型,可用用关键字create type 或者用type定义自定义类型,在此不做讨论,可参见 https://blog.csdn.net/ththcc/article/details/79961982 。
若想进一步学习,可阅读下面链接
https://www.cnblogs.com/kliine/p/10018607.html
https://www.freecplus.net/8cdd1d008f844f77bdc8bca0d5f0e0b6.html