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 数据类型 | 存储大小 | 取值范围 |
|---|---|---|
SMALLINT | 2 字节 | -32,768 ~ 32,767 |
INT / INTEGER | 4 字节 | -2,147,483,648 ~ 2,147,483,647 |
BIGINT | 8 字节 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
REAL | 4 字节 | 约 6 位十进制精度 |
DOUBLE PRECISION | 8 字节 | 约 15 位十进制精度 |
NUMERIC(p,s) / DECIMAL(p,s) | 可变 | 精度最高 131072 位;小数点前最多 131072 位,小数点后最多 16383 位 |
FLOAT | 可变 | 高精度浮点数 |
NUMBER | 可变 | 精度最高 38 位 |
BINARY_FLOAT | 4 字节 | ±3.4E+38 |
BINARY_DOUBLE | 8 字节 | ±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,000 | Oracle 兼容变长字符串 |
NCHAR(n) | 2,000 | 定长国家字符集字符串 |
NVARCHAR2(n) | 4,000 | 变长国家字符集字符串 |
TEXT | 1 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 字节 | 变长二进制数据 |
BLOB | 128 TB | 二进制大对象 |
CLOB | 128 TB | 字符大对象 |
BYTEA | 1 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 数据类型 | 最大长度 | 说明 |
|---|---|---|
LONG | 2 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 行记录)