基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
常用数据类型
更新时间:2023-07-18 17:26:00
在 OceanBase 数据库的 Oracle 模式下常用的数据类型包括:字符、数值、日期时间和间隔、RAW、大对象等数据类型。本文为您介绍各数据类型及描述。
字符数据类型
字符类型包括:CHAR、NCHAR、NVARCHAR2、VARCHAR2、VARCHAR。
| 数据类型 | 长度类型 | 使用说明 | 长度说明 |
|---|---|---|---|
| CHAR(size [BYTE | CHAR]) | 定长 | 索引效率高,程序里面使用 trim 去除多余的空白。 |
参数 size 的取值范围为 [1,2000],默认值和最小值为 1。 存储大小为 size 个字符。 |
| NCHAR[(size)] | 定长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示)。 | 参数 size 的取值范围为 [1,2000],默认值和最小值为 1。 存储大小为 size 个字符。 |
| NVARCHAR2(size) | 变长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示)。 | 参数 size 的取值范围为 [1,32767]。 存储大小为 size 个字符。 |
| VARCHAR2(size [BYTE | CHAR]) | 变长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示)。 | 参数 size 的取值范围为 [1,32767]。 存储大小为输入数据的字节或字符的实际长度,最大长度不超过 size 个字节或字符。 |
| VARCHAR(size [BYTE | CHAR]) | 变长 | OceanBase 数据库中 VARCHAR 和 VARCHAR2 没有区别。 |
参数 size 的取值范围为 [1,32767]。 存储大小为输入数据的字节的实际长度,最大长度不超过 size 个字节。 |
大对象类型
大对象类型包括:BLOB 和 CLOB。
| 数据类型 | 长度类型 | 长度(字节) | 使用说明 |
|---|---|---|---|
| BLOB | 变长 | 48 MB | 用于存储数据库中的大型二进制对象,可以将 BLOB 对象视为没有字符集语义的位流。BLOB 存储的二进制数据,其字节的长度上限为 48 MB,字符集是 BINARY。 |
| CLOB | 变长 | 48 MB | CLOB 用于存储单字节和多字节字符数据。CLOB 支持固定宽度和可变宽度字符集,且都使用数据库字符集。CLOB 可存储字节的长度上限(字节)是 48 MB,字符集与租户字符集一致。 |
数值数据类型
数值类型包括:NUMBER、FLOAT、BINARY_FLOAT、BINARY_DOUBLE。
| 数据类型 | 长度类型 | 长度(字节) | 使用说明 |
|---|---|---|---|
| NUMBER(p,s) | 变长 | [4,40] | 存储变长、十进制精度的定点数。也可以存储浮点数,此时 NUMBER 没有 p 和 s 参数。 |
| FLOAT(p) | 变长 | [4,40] | NUMBER 数据类型的子类型。二进制精度范围为 [1,126]。FLOAT 不是浮点数。 |
| BINARY_FLOAT | 定长 | 4 | 二进制精度浮点数,是一种 32 位单精度浮点数数据类型。 |
| BINARY_DOUBLE | 定长 | 8 | 二进制精度浮点数,是一种 64 位双精度浮点数数据类型。 |
日期时间和间隔数据类型
日期时间数据类型
日期时间数据类型用于保存日期和时间,OceanBase 数据库当前版本所支持的数值数据类型的信息如下表所示。
| 数据类型 | 说明 |
|---|---|
| DATE | 存储日期和时间信息,精确到秒,不带时区。格式:DD-MON-RR。 |
| TIMESTAMP | DATE 数据类型的扩展,精确到纳秒,不带时区。格式:DD-MON-RR HH.MI.SSXFF AM。 |
| TIMESTAMP WITH TIME ZONE | DATE 数据类型的扩展,精确到纳秒,带时区信息。格式:DD-MON-RR HH.MI.SSXFF AM TZR。 |
| TIMESTAMP WITH LOCAL TIME ZONE | 带有本地时区的 TIMESTAMP,存储数据库时区。格式:DD-MON-RR HH.MI.SSXFF AM。 |
间隔数据类型
与日期时间数据类型存储特定的一个时间点不同,间隔数据类型用来存储一段时间。间隔数据类型有效的存储了两个日期时间值之间的差异,此类别中有以下数据类型:
| 数据类型 | 说明 |
|---|---|
| INTERVAL YEAR TO MONTH | 存储以年和月为单位的时间段。 |
| INTERVAL DAY TO SECOND | 存储以天、小时、分钟和秒为单位的时间段。 |
相关字段和值
日期时间和间隔都由字段组成,这些字段的值决定了数据类型的值。
| 字段 | 日期时间的有效值 | 间隔的有效值 |
|---|---|---|
YEAR |
-4712 ~ 9999 (不包括第 0 年) | 任何正整数或负整数。 |
MONTH |
01 ~ 12 | 0 ~ 11 |
DAY |
01 ~ 31 (受 MONTH 和 YEAR 的值限制,根据当前 NLS 日历参数的规则) |
任何正整数或负整数。 |
HOUR |
00 ~ 23 | 0 ~ 23 |
MINUTE |
00 ~ 59 | 0 ~ 59 |
SECOND |
00 ~ 59.9(n) 其中 9(n) 是时间小数秒的精度。9(n) 部分不适用于 DATE。 |
0 ~ 59.9(n) 其中 9(n) 是间隔小数秒的精度。 |
TIMEZONE_HOUR |
-12 ~ 14(此范围适应夏令时更改) 不适用于 DATE 或 TIMESTAMP。 |
不适用 |
TIMEZONE_MINUTE |
00 ~ 59 不适用于 DATE 或 TIMESTAMP。 |
不适用 |
TIMEZONE_REGION |
查询 V$TIMEZONE_NAMES 数据字典视图的 TZNAME 列。 不适用于 DATE 或 TIMESTAMP。 |
不适用 |
TIMEZONE_ABBR |
查询 V$TIMEZONE_NAMES 数据字典视图的 TZABBREV 列。 不适用于 DATE 或 TIMESTAMP。 |
不适用 |
RAW 数据类型
RAW 是一种可变长度的数据类型,可以在具有不同字符集的数据库之间,或者具有不同字符集的服务器和客户端之间传输二进制数据流,而不需要字符集转换。
| 类型 | 使用范围 | 描述 |
|---|---|---|
| RAW | 如果作为数据库中表的列,该参数最大支持存储 2000 字节的数据;如果作为 PL 变量,该参数最大支持存储 32767 字节的数据。 | 可以用于存储二进制数据或者字节串,例如图像、音频等。 |
Rowid 数据类型
Rowid 数据类型包括:Rowid、URowid。
| 类型 | 描述 |
|---|---|
| Rowid | 可以通过查询伪列 ROWID 来检查 ROWID 行地址。该伪列的值为表示每行地址的字符串,这些字符串的数据类型为 ROWID。您还可以创建包含具有 ROWID 数据类型列的表。ROWID 通过 Base64 编码转换而成。 |
| URowid | 某些表的行具有非物理或永久地址,或者不是由 OceanBase 数据库生成的地址。例如,索引组织表的行地址存储在索引叶中,是可以移动的。索引组织表具有逻辑 UROWID,UROWID 存储在 ROWID 伪列中。 |
用户自定义数据类型
用户自定义数据类型包括:对象类型、数组、嵌套表。
| 类型 | 描述 |
|---|---|
| 对象类型 | 对象类型是应用程序处理的真实世界实体(例如采购订单)的抽象。对象类型作为 Schema 对象具有如下三种部分:
|
| 数组 | 数组是一组有序的数据元素。指定数组的所有元素都具有相同的数据类型。每个元素都有一个索引,即对应于该元素在数组中所在位置的一个数字。 数组中元素的数量就是数组的大小。数组的大小可变,所以被称为 Varray。声明数组时必须指定最大大小。 当声明一个数组时,它不会分配空间,而是定义了一个类型,可以将其用于如下场景:
|
| 嵌套表 | 嵌套表类型对一组无序的元素进行建模。元素可以是内置类型或用户定义类型。您可以将嵌套表作为单列表,如果嵌套表是对象类型,则可以作为多列表,对象类型的每个属性都对应一列。 嵌套表定义不分配空间。它定义了一个类型,您可以使用它来声明:
|
示例
示例 1
下述用例对字符、数值、日期等常用数据类型,在 OceanBase 数据库环境中进行了验证。
创建
t_data_types。CREATE TABLE t_data_types( id number NOT NULL PRIMARY KEY, c_char char(100), c_varchar varchar2(100), c_nchar nchar(100), c_nvarchar nvarchar2(100), c_numeric numeric(10, 2), c_int int, c_float float(2), c_binary_float binary_float, c_binary_double binary_double, c_raw raw(2000), c_blob blob, c_clob clob, c_date date, c_timestamp timestamp, c_timestamp2 timestamp WITH time ZONE, c_timestamp3 timestamp WITH LOCAL time zone, c_interval_year INTERVAL YEAR TO MONTH, c_interval_day INTERVAL DAY TO SECOND );将数据插入
全类型表。INSERT INTO t_data_types VALUES ( 1, '二', '三', '四', 5, 6, 7.0, 8.0, 9.0, 10.0, utl_raw.cast_to_raw('17'), to_blob('18'), to_clob('19'), date '1970-11-11', TO_TIMESTAMP('1970-12-12 12:12:12', 'YYYY-MM-DD HH24:MI:SS'), TIMESTAMP '1970-02-13 13:13:13.123', TIMESTAMP '1970-02-14 14:14:14.123', INTERVAL '12-3' YEAR TO MONTH, INTERVAL '16 16:16:16' DAY TO SECOND );查询
全类型表。obclient> select * from t_data_types; +----+------------------------------------------------------------------------------------------------------+-----------+--------------------------------------------------------------------------------------------------------+------------+-----------+-------+---------+----------------+-----------------+-------+--------------+--------+-----------+------------------------------+-------------------------------------+------------------------------+-----------------+---------------------+ | ID | C_CHAR | C_VARCHAR | C_NCHAR | C_NVARCHAR | C_NUMERIC | C_INT | C_FLOAT | C_BINARY_FLOAT | C_BINARY_DOUBLE | C_RAW | C_BLOB | C_CLOB | C_DATE | C_TIMESTAMP | C_TIMESTAMP2 | C_TIMESTAMP3 | C_INTERVAL_YEAR | C_INTERVAL_DAY | +----+------------------------------------------------------------------------------------------------------+-----------+--------------------------------------------------------------------------------------------------------+------------+-----------+-------+---------+----------------+-----------------+-------+--------------+--------+-----------+------------------------------+-------------------------------------+------------------------------+-----------------+---------------------+ | 1 | 二 | 三 | 四 | 5 | 6 | 7 | 8 | 9.0E+000 | 1.0E+001 | 3137 | 18 | 19 | 11-NOV-70 | 12-DEC-70 12.12.12.000000 PM | 13-FEB-70 01.13.13.123000 PM +08:00 | 14-FEB-70 02.14.14.123000 PM | +12-03 | +16 16:16:16.000000 | +----+------------------------------------------------------------------------------------------------------+-----------+--------------------------------------------------------------------------------------------------------+------------+-----------+-------+---------+----------------+-----------------+-------+--------------+--------+-----------+------------------------------+-------------------------------------+------------------------------+-----------------+---------------------+ 1 row in set
示例 2
下述以对象类型为例,在 ODC 平台与 OceanBase 数据库中对用户自定义数据类型进行了验证。
在 ODC 的 SQL 窗口中,创建
data_type表。
在 ODC 的 SQL 窗口中,将
data_type表中插入数据。
在 ODC 的 SQL 窗口中,创建自定义类型
ob_var。
在 ODC 的 SQL 窗口中,创建存储过程 ,并调用自定义类型
ob_var。
运行自定义数据类型。

说明
也可以在命令行中运行上述代码。
create table data_type (id number(10),name varchar2(50),age int,address varchar2(50),salary float);// insert into data_type values(1,'baba',20,'hangzhou',3000.00);// create or replace type ob_var as object( var varchar2(10), var1 varchar(10) );// create or replace procedure p_datatype is begin declare rec data_type%rowtype; v_age rec.age%type; var varchar2(50); v_name var%type; v_salary data_type.salary%type; type salary is table of number index by varchar2(20); arr salary; v_arr arr%type; CURSOR c2 IS SELECT name, age FROM data_type; c_row c2%rowtype; v_rec c_row%type; ob ob_var; v_obj ob%type; begin v_name := 'ali '; v_age := 30; v_salary := 2000; dbms_output.put_line('被引用项: 变量,记录,表列名称: ' || v_name || ' * ' || v_age || ' * ' || v_salary); v_arr('James') := 78000; dbms_output.put_line('被引用项: 集合变量的名称: ' || v_arr.FIRST); open c2; fetch c2 into v_rec; dbms_output.put_line('被引用项: 游标变量名称: ' || v_rec.name || ' * ' || v_rec.age); close c2; v_obj:=ob_var('test','object'); dbms_output.put_line('被引用项: 对象实例的名称: ' || v_obj.var || ' * ' || v_obj.var1); end; end; // set serveroutput on; begin p_datatype; end; //