暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle数据类型

原创 点点 2023-04-21
1793

每个列都有一种数据类型,这与特定的存储格式、限制、和有效的值范围相关联。一个值的数据类型与一组固定的属性相关联。这些属性会使Oracle数据库区别对待不同数据类型的值。例如,你可以把NUMBER数据类型的值相乘,但不能把RAW数据类型的值相乘。
在创建表时,您必须为每个列指定数据类型。随后在该列中插入的每个值都假定为该列的数据类型。
Oracle数据库提供了几种内建的数据类型。最常用的数据类型分为以下几类:
•字符数据类型
•数字数据类型
•日期时间数据类型
•ROWID数据类型
•格式模型和数据类型
其他几种重要的内建类型包括RAW、大对象(LOB)、和集合。PL/SQL具有用于常量和变量的数据类型,包括布尔、引用类型、复合类型(记录)、和用户定义类型。

字符数据类型

字符数据类型存储在字符串中的字符(字母或数字)数据。最常用的字符数据类型是VARCHAR2,它是用于存储字符数据的最有效的选项。
与字符编码模式相对应的字节值,一般称为字符集或代码页。数据库字符集是在数据库创建时建立的。字符集的例子有7位ASCII码、EBCDIC码、和UnicodeUTF-8。
字符数据类型的长度语义可以以字节或字符为单位。字节语义将字符串视为一个字节序列。这是字符数据类型的默认值。字符语义将字符串视为字符序列。一个字符在技术上是数据库字符集中的一个编码点。
VARCHAR2和CHAR数据类
VARCHAR2数据类型存储变长字符文本。文本和常量值这两个术语是同义词,指的是一个固定的数据值。例如’LILA’、‘St.GeorgeIsland’、和’101’,都是字符文本;5001是数字文本。字符文本包括在单引号中,以便数据库可以将它们与模式对象名称区分开来。
注意:
本手册中,文本、文本字符、和字符串等术语的使用具有互换性。
当创建一个有VARCHAR2列的表时,指定该列的最大字符串长度。在示例2-1中,last_name列是VARCHAR2(25)数据类型,这意味着该列中存储的名字最多可以长达25个字节。
对每一行,Oracle数据库将按可变长度字段来存储值,如果一个值超出最大长度,数据库将返回一个错误。例如,在单字节字符集中,如果您在某行的last_name列输入10个字符,那么在行片中该列只存储10个字符(10个字节)而不是25。使用VARCHAR2可以减少空间占用。
与VARCHAR2不同,CHAR存储固定长度的字符串。当创建一个有CHAR列的表时,需要为该列指定一个字符串长度。默认值是1个字节。数据库使用空格填充到指定的长度的值。
Oracle数据库将使用非填充比较语义来比较VARCHAR2值,而使用空白填充比较语义来比较CHAR值。
NCHAR和NVARCHAR2数据类型
NVARCHAR2和NCHAR数据类型存储Unicode字符数据。Unicode是一种通用的编码字符集,可以将任何语言的信息存储在一种字符集中。NCHAR存储对应于国家字符集的固定长度字符串,而NVARCHAR2存储可变长度的字符串。
当您创建数据库时,指定国家字符集。NCHAR和NVARCHAR2数据类型的字符集必须是AL16UTF16或UTF8。这两种字符集都使用Unicode编码。
当您创建一个有NCHAR或NVARCHAR2列的表时,其最大大小始终是字符长度语义。对于NCHAR或NVARCHAR2,字符长度语义是默认的,也是唯一的长度语义。

数字数据类型

Oracle数据库的数字数据类型存储固定和浮点数字、零、或无穷。某些数值类型也可以存储未定义操作的结果值,叫做"非数字"或NAN。
Oracle数据库以变长格式存储数字数据。用科学计数法存储值,其中一个字节用于存储指数。数据库使用最多20个字节存储尾数,即浮点数的有效位数部分。Oracle数据库不会存储前导零和结尾零。

NUMBER数据类型

NUMBER数据类型存储固定和浮点数字。数据库可以存储几乎任何规模的数字。此数据保证在运行Oracle数据库的不同操作系统之间可移植。大多数情况下,当您必须存储数值数据时,推荐使用NUMBER数据类型。
按NUMBER(p,s)的形式定义定点数,p和s有以下特征:
•精度
精度指定数字的总长度。如果不指定精度,则列按应用程序提供的数据存储值,不作任何舍入。
•小数位数
小数位数指从十进制的小数点到最小有效数字的位数。正小数位数从小数点向右计数直至最小有效位。负小数位数从小数点向左计数直至(但不包括)最小有效数字。如果您指定了精度但没有指定小数位数,如NUMBER(6),那么小数位数为0。
在示例2-1中,工资列是NUMBER(8,2)类型,精度为8,而小数位数为2。因此,数据库将10万元的薪金存储为100000.00。
浮点数
Oracle数据库为浮点数提供了两种互斥的数值数据类型:BINARY_FLOAT和BINARY_DOUBLE。这两种类型支持所有NUMBER数据类型提供的基本功能。然而,相比NUMBER使用十进制精度,BINARY_FLOAT和BINARY_DOUBLE使用二进制精度,可以使算术计算更快并且通常可以降低存储需求。
BINARY_FLOAT和BINARY_DOUBLE是近似数字数据类型。它们存储十进制的值的近似表示,而不是精确的表示形式。例如值0.1不能用BINARY_DOUBLE或BINARY_FLOAT完全精确地表示。他们经常用于科学计算。其行为类似于Java或XMLSchema中的FLOAT和DOUBLE数据类型。

日期时间数据类型

日期时间数据类型包括DATE和TIMESTAMP。Oracle数据库为时间戳提供全面的时区支持。

DATE数据类型

DATE数据类型存储日期和时间。尽管日期时间可以用字符或数字数据类型表示,DATE具有特殊的相关属性。示例2-1中的hire_date列是一个DATE数据类型。
数据库在内部将日期存储为数字。日期被存储为固定长度的域,共7个字节,分别对应世纪、年、月、日、小时、分、和秒。
注意:
日期完全支持算术操作,您可以像对数字一样,对日期进行加减操作。
数据库根据指定的格式模型显示日期。格式模型是一个描述在字符串中的日期时间格式的字符文字。标准的日期格式是DD-MON-RR,它会以01-JAN09的形式显示日期。
RR类似于YY(年的最后两位),但返回值的世纪值会因指定的两位年份及本年度的最后两位不同而不同。假设在1999年,数据库显示为01-JAN09。如果日期格式使用RR,那么09指的是2009,而如果格式使用YY,那么09指的是1909。您可以更改实例或会话级别的默认日期格式。
Oracle数据库以24小时制格式存储时间——HH:MI:SS。如果不输入的任何时间部分,那么默认情况下,日期字段中的时间是凌晨00:00:00,如果只输入了时间,则日期部分默认为当月的第一天

TIMESTAMP数据类型

TIMESTAMP数据类型是日期数据类型的扩展。除了存储DATE数据类型的信息,它同时还存储秒的小数部分。TIMESTAMP数据类型对于存储精确时间的值很有用,比如那些必须跟踪事件顺序的应用程序。
DATETIME数据类型TIMESTAMPWITHTIMEZONE和TIMESTAMPWITHLOCALTIMEZONE能感知时区。当用户选择数据时,其值会被调整以适配用户会话的时区。此数据类型可用于收集和评估各地理区域的日期信息。

Rowid数据类型

存储在数据库中的每一行都有一个地址。Oracle数据库使用ROWID数据类型存储在数据库中的每一行的地址(rowid)。Rowids分为以下几类:
•物理rowids存储堆组织表、表簇、表分区、和索引分区中的行地址。
•逻辑rowids存储索引组织表中的行地址。
•外部rowids是外来表(如通过网关访问的DB2表)中的标识符。他们不是标准的Oracle数据库rowids。
有一种数据类型称为通用rowid或UROWID,支持各种rowids。
使用Rowid
Oracle数据库在内部使用rowids用于构造索引,最常见的B树索引,包含一个被划分成多个键范围的排序列表。每个键都与一个指向关联的行地址的rowid相关联,用于快速访问行。最终用户和应用程序开发人员也可以使用rowids的几个重要功能:
•Rowids是访问特定行的最快方式。
•Rowids提供了查看表的组织方式的能力。
•Rowids是给定表中的行的唯一标识符。
您也可以创建带ROWID数据类型列的表。例如,您可以定义一个异常表,其中一列为ROWID数据类型,以存储违反了完整性约束的行rowids。使用ROWID数据类型定义的列像其他表中的列一样,其值可以更新,等等。
ROWID伪列
Oracle数据库中的每个表都有一个名为ROWID的伪列。伪列类似于表列,但实际上并不存储在表中。您可以从伪列中选择数据,但不能插入、更新、或删除它们的值。伪列也类似于不带参数的SQL函数。不带参数的函数对于结果集中的每一行通常返回相同的值,而伪列通常为每个行返回不同的值。
ROWID伪列的值是表示的每个行的地址的字符串。这些字符串具有的数据类型ROWID。在执行SELECT或DESCRIBE列出表的结构时,此伪列并不显示,它也不占用空间。但是,每个行的rowid可以通过使用保留字ROWID作为列名的SQL查询来检索。
示例2-4查询显示雇员表中雇员ID为100的行的ROWID伪列。

格式模型与数据类型

格式模型是一个字符文本,用来描述存储在一个字符串中的日期时间或数值数据的格式。格式模式不会更改数据库中的值的内部表示形式。
当您将一个字符串转换成日期或数字时,格式模型决定了数据库如何解释字符串。在SQL中,你可以使用格式模型作为TO_CHAR和TO_DATE函数的参数,来格式化将从数据库中返回的一个值,或将存储到数据库中的一个值。
下面的语句选择部门80中的雇员的薪水,并使用TO_CHAR函数来将这些薪水的值,转换为以数字格式模型’$99,990.99’指定的字符值:
image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论