跳到主要内容

Oracle 数据类型

Halo 数据库在 Oracle 兼容模式下支持 Oracle 常用的数据类型。类型映射如下:

分类Oracle 数据类型
数字类型SMALLINT、INT / INTEGER、BIGINT、FLOAT、REAL、DOUBLE PRECISION、NUMERIC(p,s) / DECIMAL(p,s)、NUMBER、BINARY_FLOAT、BINARY_DOUBLE
字符类型CHAR(n) / CHARACTER(n)、VARCHAR(n) / CHARACTER VARYING(n)、VARCHAR2(n)、NCHAR(n)、NVARCHAR2(n)、TEXT
日期/时间DATE、TIMESTAMP(p)、TIMESTAMP(p) WITH TIME ZONE、INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND(p)、TIME
二进制RAW(n)、BLOB、CLOB、BYTEA
大文本LONG
布尔BOOLEAN
伪表DUAL

数字类型​

Oracle 兼容模式支持以下数字类型:

Oracle 数据类型存储大小取值范围
SMALLINT2 字节-32,768 ~ 32,767
INT / INTEGER4 字节-2,147,483,648 ~ 2,147,483,647
BIGINT8 字节-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
REAL4 字节约 6 位十进制精度
DOUBLE PRECISION8 字节约 15 位十进制精度
NUMERIC(p,s) / DECIMAL(p,s)可变精度最高 131072 位;小数点前最多 131072 位,小数点后最多 16383 位
FLOAT可变高精度浮点数
NUMBER可变精度最高 38 位
BINARY_FLOAT4 字节±3.4E+38
BINARY_DOUBLE8 字节±1.7E+308

示例

oracle=# CREATE TABLE smallint_test ( small_number SMALLINT );
oracle=# INSERT INTO smallint_test (small_number) VALUES (-32768);
oracle=# INSERT INTO smallint_test (small_number) VALUES (32767);
oracle=# INSERT INTO smallint_test (small_number) VALUES (100);
oracle=# SELECT * FROM smallint_test;
small_number
--------------
-32768
32767
100
(3 行记录)

oracle=# CREATE TABLE int_test ( int_number INT );
oracle=# INSERT INTO int_test (int_number) VALUES (-2147483648);
oracle=# INSERT INTO int_test (int_number) VALUES (2147483647);
oracle=# INSERT INTO int_test (int_number) VALUES (123);
oracle=# SELECT * FROM int_test;
int_number
-------------
-2147483648
2147483647
123
(3 行记录)

oracle=# CREATE TABLE numeric_test (
high_precision_number NUMERIC(30, 20),
large_number NUMERIC
);
oracle=# INSERT INTO numeric_test (high_precision_number) VALUES (123456.78901234567890123456);
oracle=# INSERT INTO numeric_test (large_number) VALUES (1234567890123456789012345678901234567890);
oracle=# SELECT * FROM numeric_test;
high_precision_number | large_number
-----------------------------+------------------------------------------
123456.78901234567890123456 |
| 1234567890123456789012345678901234567890
(2 行记录)

字符类型​

Oracle 兼容模式支持以下字符类型:

Oracle 数据类型最大长度说明
CHAR(n) / CHARACTER(n)10,485,760定长字符串,不足长度补空格
VARCHAR(n) / CHARACTER VARYING(n)10,485,760变长字符串
VARCHAR2(n)4,000Oracle 兼容变长字符串
NCHAR(n)2,000定长国家字符集字符串
NVARCHAR2(n)4,000变长国家字符集字符串
TEXT1 GB不限长度文本

示例

oracle=# CREATE TABLE char_test ( fixed_char CHAR(10) );
oracle=# INSERT INTO char_test (fixed_char) VALUES ('1234567890');
oracle=# INSERT INTO char_test (fixed_char) VALUES ('hello');
oracle=# SELECT fixed_char, LENGTH(fixed_char) FROM char_test;
fixed_char | length
------------+--------
1234567890 | 10
hello | 10
(2 行记录)

oracle=# CREATE TABLE varchar_test ( variable_char VARCHAR(10) );
oracle=# INSERT INTO varchar_test (variable_char) VALUES ('1234567890');
oracle=# INSERT INTO varchar_test (variable_char) VALUES ('hello');
oracle=# SELECT variable_char, LENGTH(variable_char) FROM varchar_test;
variable_char | length
---------------+--------
1234567890 | 10
hello | 5
(2 行记录)

oracle=# CREATE TABLE text_test ( content TEXT );
oracle=# INSERT INTO text_test (content) VALUES ('这是一个长文本测试。');
oracle=# SELECT * FROM text_test;
content
---------------------------------------------------
这是一个长文本测试。
(1 行记录)

日期/时间类型​

Oracle 兼容模式支持以下日期/时间类型:

Oracle 数据类型说明
DATE日期(年月日),格式为 yyyy-mm-dd
TIMESTAMP(p)时间戳(年月日时分秒),精度 p 为秒的小数位数
TIMESTAMP(p) WITH TIME ZONE带时区的时间戳
INTERVAL YEAR TO MONTH年-月间隔
INTERVAL DAY TO SECOND(p)日-秒间隔
TIME时间(时分秒)

示例

oracle=# CREATE TABLE datetime_test (
a_date DATE,
a_time TIMESTAMP(0),
a_timestamp TIMESTAMP(6),
a_timestamptz TIMESTAMP(6) WITH TIME ZONE,
a_interval_year_month INTERVAL YEAR TO MONTH,
a_interval_day_second INTERVAL DAY TO SECOND(6)
);
oracle=# INSERT INTO datetime_test (a_date, a_time, a_timestamp, a_timestamptz, a_interval_year_month, a_interval_day_second)
VALUES (
TO_DATE('2024-01-01', 'YYYY-MM-DD'),
TO_TIMESTAMP('12:34:56', 'HH24:MI:SS'),
TO_TIMESTAMP('2024-01-01 12:34:56', 'YYYY-MM-DD HH24:MI:SS'),
TIMESTAMP '2025-05-23 08:30:00 Asia/Shanghai',
INTERVAL '1' YEAR + INTERVAL '2' MONTH,
INTERVAL '1' DAY + INTERVAL '2' HOUR + INTERVAL '3' MINUTE + INTERVAL '4' SECOND
);
oracle=# \x on
扩展显示已打开
oracle=# SELECT * FROM datetime_test;
-[ RECORD 1 ]---------+-----------------------
A_DATE | 2024-01-01 00:00:00
A_TIME | 0001-01-01 12:34:56 BC
A_TIMESTAMP | 2024-01-01 12:34:56
A_TIMESTAMPTZ | 2025-05-23 08:30:00+08
A_INTERVAL_YEAR_MONTH | 1 year 2 mons
A_INTERVAL_DAY_SECOND | 1 day 02:03:04

日期格式化

oracle=# SELECT TO_CHAR(TIMESTAMP '2024-06-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS') AS formatted_date;
formatted_date
---------------------
2024-06-15 14:30:00
(1 行记录)

日期计算

oracle=# SELECT CURRENT_DATE + INTERVAL '10' DAY FROM DUAL;
?column?
---------------------
2026-08-07 00:00:00
(1 行记录)

二进制类型​

Oracle 兼容模式支持以下二进制类型:

Oracle 数据类型最大长度说明
RAW(n)2,000 字节变长二进制数据
BLOB128 TB二进制大对象
CLOB128 TB字符大对象
BYTEA1 GB二进制数据

示例

oracle=# CREATE TABLE raw_test( raw_data RAW(10) );
oracle=# INSERT INTO raw_test(raw_data) VALUES ('A');
oracle=# INSERT INTO raw_test(raw_data) VALUES ('1');
oracle=# SELECT * FROM raw_test;
raw_data
----------
0A
01
(2 行记录)

oracle=# CREATE TABLE blob_test( data BYTEA );
oracle=# INSERT INTO blob_test (data) VALUES (DECODE('48656C6C6F20576F726C64', 'HEX'));
oracle=# SELECT * FROM blob_test;
data
--------------------------
\x48656c6c6f20576f726c64
(1 行记录)

LONG 类型​

Oracle 数据类型最大长度说明
LONG2 GB变长大文本数据

示例

oracle=# CREATE TABLE long_test ( id INTEGER, long_data TEXT );
oracle=# INSERT INTO long_test (id, long_data) VALUES (1, 'This is a long text.');
oracle=# INSERT INTO long_test (id, long_data) VALUES (2, RPAD('A', 10000, 'A'));
oracle=# SELECT * FROM long_test;
id | long_data
----+-----------------------------------------------------------------------
1 | This is a long text.
2 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
(2 行记录)

布尔类型​

Oracle 数据类型说明
BOOLEAN布尔值:TRUE / FALSE

示例

oracle=# CREATE TABLE bool_test ( flag BOOLEAN );
oracle=# INSERT INTO bool_test VALUES (TRUE);
oracle=# INSERT INTO bool_test VALUES (FALSE);
oracle=# SELECT * FROM bool_test;
flag
------
t
f
(2 行记录)