数据类型
Halo 数据库在 PostgreSQL 兼容模式下支持完整的 PostgreSQL 数据类型。
数值类型
| 类型 | 存储大小 | 范围 |
|---|---|---|
| SMALLINT | 2 字节 | -32768 到 +32767 |
| INTEGER / INT | 4 字节 | -2147483648 到 +2147483647 |
| BIGINT | 8 字节 | -9223372036854775808 到 +9223372036854775807 |
| REAL | 4 字节 | 6 位十进制数字精度 |
| DOUBLE PRECISION | 8 字节 | 15 位十进制数字精度 |
| NUMERIC(p,s) / DECIMAL(p,s) | 可变 | 小数点前 131072 位,小数点后 16383 位 |
| SERIAL | 4 字节 | 自增整数(1 到 2147483647) |
-- 整数类型
CREATE TABLE int_test (
id SERIAL PRIMARY KEY,
small_num SMALLINT,
num INTEGER,
big_num BIGINT
);
INSERT INTO int_test (small_num, num, big_num) VALUES (-32768, 2147483647, 9223372036854775807);
SELECT * FROM int_test;
-- 高精度小数
CREATE TABLE numeric_test (
id SERIAL PRIMARY KEY,
price NUMERIC(10,2),
ratio DECIMAL(30,20)
);
INSERT INTO numeric_test (price, ratio) VALUES (12345.67, 123456.78901234567890123456);
SELECT * FROM numeric_test;
字符类型
| 类型 | 说明 | 最大长度 |
|---|---|---|
| CHAR(n) / CHARACTER(n) | 定长字符串 | 10485760 |
| VARCHAR(n) / CHARACTER VARYING(n) | 变长字符串 | 10485760 |
| TEXT | 变长字符串 | 1 GB |
CREATE TABLE char_test (
id SERIAL PRIMARY KEY,
fixed_char CHAR(10),
variable_char VARCHAR(100),
long_text TEXT
);
INSERT INTO char_test (fixed_char, variable_char, long_text)
VALUES ('hello', 'world', 'This is a long text field');
日期/时间类型
| 类型 | 存储大小 | 说明 |
|---|---|---|
| DATE | 4 字节 | 日期(无时间) |
| TIME | 8 字节 | 时间(无日期) |
| TIMETZ | 12 字节 | 带时区的时间 |
| TIMESTAMP | 8 字节 | 日期和时间 |
| TIMESTAMPTZ | 8 字节 | 带时区的日期和时间 |
| INTERVAL | 16 字节 | 时间间隔 |
CREATE TABLE datetime_test (
id SERIAL PRIMARY KEY,
a_date DATE,
a_time TIME,
a_timestamp TIMESTAMP,
a_timestamptz TIMESTAMPTZ,
a_interval INTERVAL
);
INSERT INTO datetime_test (a_date, a_time, a_timestamp, a_timestamptz, a_interval)
VALUES ('2024-01-01', '12:34:56', '2024-01-01 12:34:56', '2024-01-01 12:34:56+00',
'3 years 4 months 1 day 2 hours 30 minutes 15 seconds');
-- 日期加减与格式化
SELECT CURRENT_DATE + INTERVAL '10 days';
SELECT to_char(a_timestamp, 'YYYY-MM-DD HH24:MI:SS') AS formatted_date FROM datetime_test;
布尔类型
CREATE TABLE bool_test (
a BOOL,
b BOOLEAN
);
INSERT INTO bool_test VALUES ('y', 'n'), (TRUE, FALSE);
SELECT * FROM bool_test;
二进制类型
CREATE TABLE bytea_test (
id SERIAL PRIMARY KEY,
data BYTEA
);
INSERT INTO bytea_test (data) VALUES ('\x48656C6C6F20576F726C64');
SELECT * FROM bytea_test;
高级数据类型
-- JSON 和 XML
CREATE TABLE advanced_test (
json_data JSON,
xml_data XML
);
INSERT INTO advanced_test VALUES (
'{"name":"Halo","version":"16"}'::JSON,
'<title>Halo Database</title>'::XML
);
SELECT * FROM advanced_test;