数据类型

SQL 数据类型定义了列可以存储的数据类型。当您运行 DESC TABLE 命令时,你可以看到每列的数据类型。

字符串和二进制数据类型

类型名称 描述 大小
String UTF-8 编码的字符串。最多可容纳 2,147,483,647 字节的数据 字符串的长度
Binary 变长二进制值。最多可容纳 2,147,483,647 字节的数据 数据的长度 + 2 字节

String 和 Binary 的最大容量取决于它们的编码方式以及存储引擎如何处理它们。例如,String 值被编码为 UTF-8,如果所有字符的长度为 3 个字节,该字段最多可以存储 715,827,882 个字符。对于 Binary 类型,它们最多可以存储 2,147,483,647 字节。

数值数据类型

类型名称 描述 大小
Int8 -128 ~ 127 1 字节
Int16 -32768 ~ 32767 2 字节
Int32 -2147483648 ~ 2147483647 4 字节
Int64 -9223372036854775808 ~ 9223372036854775807 8 字节
UInt8 0 ~ 255 1 字节
UInt16 0 ~ 65535 2 字节
UInt32 0 ~ 4294967295 4 字节
UInt64 0 ~ 18446744073709551615 8 字节
Float32 32 位 IEEE 754 浮点数 4 字节
Float64 双精度 IEEE 754 浮点数 8 字节

Decimal 类型

GreptimeDB 支持 decimal 类型,这是一种定点类型,表示为 decimal(precision, scale),其中 precision 是总位数,scale 是小数部分的位数。例如,123.45 的总位数为 5,小数位数为 2。

  • precision 可以在 [1, 38] 范围内。
  • scale 可以在 [0, precision] 范围内。

如果未指定总位数和比例,则默认的十进制数是 decimal(38, 10)。

1. CREATE TABLE decimals(
2. d DECIMAL(3, 2),
3. ts TIMESTAMP TIME INDEX,
4. );

6. INSERT INTO decimals VALUES ('0.1',1000), ('0.2',2000);

8. SELECT * FROM decimals;
1. +------+---------------------+
2. | d    | ts                  |
3. +------+---------------------+
4. | 0.10 | 1970-01-01T00:00:01 |
5. | 0.20 | 1970-01-01T00:00:02 |
6. +------+---------------------+

日期和时间类型

类型名称 描述 大小
TimestampSecond 64 位时间戳值,精度为秒 8 字节
TimestampMillisecond 64 位时间戳值,毫秒精度 8 字节
TimestampMicroSecond 64 位时间戳值,微秒精度 8 字节
TimestampNanosecond 64 位时间戳值,纳秒精度 8 字节
Interval 时间间隔 YearMonth 占 4 字节,DayTime 占 8 字节,MonthDayNano 占 16 字节

Interval 类型详解

Interval 类型用于需要跟踪和操作时间间隔的场景。它的编写语法如下:

1. QUANTITY UNIT [QUANTITY UNIT...]
  • QUANTITY:是一个数字(可能有符号),
  • UNIT:时间单位,可以是 microsecond(微秒)、millisecond(毫秒)、second(秒)、minute(分钟)、hour(小时)、day(天)、week(周)、month(月)、year(年)、decade(十年)、century(世纪)或这些单位的缩写或复数形式;

不同的时间单位将会被计算合并,每个单位的符号决定它是增加还是减少总间隔。例如,“1 年 -2 个月”导致净间隔为 10 个月。 遗憾的是,GreptimeDB 暂时还不支持以 ISO 8601 时间间隔格式编写间隔,例如 P3Y3M700DT133H17M36.789S 等。但它支持以这种格式输出。

让我们来看一些例子:

1. SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::INTERVAL;
1. +---------------------------------------------------------------------+
2. | Utf8("2 years 15 months 100 weeks 99 hours 123456789 milliseconds") |
3. +---------------------------------------------------------------------+
4. | P3Y3M700DT133H17M36.789S                                            |
5. +---------------------------------------------------------------------+

55 分钟前:

1. SELECT '-1 hour 5 minute'::INTERVAL;
1. +--------------------------+
2. | Utf8("-1 hour 5 minute") |
3. +--------------------------+
4. | P0Y0M0DT0H-55M0S         |
5. +--------------------------+

1 小时 5 分钟前:

1. SELECT '-1 hour -5 minute'::INTERVAL;
1. +---------------------------+
2. | Utf8("-1 hour -5 minute") |
3. +---------------------------+
4. | P0Y0M0DT-1H-5M0S          |
5. +---------------------------+

当然,你可以通过算术运算来操作时间间隔。 获取 5 分钟前的时间:

1. SELECT now() - INTERVAL '5 minute';
1. +----------------------------------------------+
2. | now() - IntervalMonthDayNano("300000000000") |
3. +----------------------------------------------+
4. | 2024-06-24 21:24:05.012306                   |
5. +----------------------------------------------+

注意到你也可以用 INTERVAL 'literal' 的方式来输入 interval 类型。'-1 hour -5 minute'::INTERVAL 这样的方式其实是一个CAST 函数调用。

GreptimeDB 还支持类似 3y2mon4h 这样不包含空格的简写形式:

1. SELECT INTERVAL '3y2mon4h';
2. SELECT '3y2mon4h'::INTERVAL;
1. +---------------------------------------------------------+
2. | IntervalMonthDayNano("3010670175542044842954670112768") |
3. +---------------------------------------------------------+
4. | P3Y2M0DT4H0M0S                                          |
5. +---------------------------------------------------------+
6. +---------------------------------------------------------+
7. | IntervalMonthDayNano("3010670175542044842954670112768") |
8. +---------------------------------------------------------+
9. | P3Y2M0DT4H0M0S                                          |
10. +---------------------------------------------------------+

同样也支持符号数:

1. SELECT INTERVAL '-1h5m';
2. SELECT '-1h5m'::INTERVAL;
1. +----------------------------------------------+
2. | IntervalMonthDayNano("18446740773709551616") |
3. +----------------------------------------------+
4. | P0Y0M0DT0H-55M0S                             |
5. +----------------------------------------------+
6. +----------------------------------------------+
7. | IntervalMonthDayNano("18446740773709551616") |
8. +----------------------------------------------+
9. | P0Y0M0DT0H-55M0S                             |
10. +----------------------------------------------+

支持的缩写包括:

缩写 全称
y years
mon months
w weeks
d days
h hours
m minutes
s seconds
millis milliseconds
ms milliseconds
us microseconds
ns nanoseconds

布尔类型

类型名称 描述 大小
Boolean 布尔值 1 字节

在 SQL 语句中使用 TRUE 或 FALSE 表示布尔值。例如:

1. CREATE TABLE bools(
2. b BOOLEAN,
3. ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP() TIME INDEX,
4. );
1. INSERT INTO bools(b) VALUES (TRUE), (FALSE);

与 MySQL 和 PostgreSQL 兼容的数据类型

类型别名

对于从 MySQL 或 PostgreSQL 迁移到 GreptimeDB 的用户,GreptimeDB 支持以下类型别名。

数据类型 别名
String Text, TinyText, MediumText, LongText, Varchar, Char
Binary Varbinary
Int8 TinyInt
Int16 SmallInt
Int32 Int
Int64 BigInt
UInt8 UnsignedInt
UInt16 UnsignedTinyInt
UInt32 UnsignedSmallInt
UInt64 UnsignedBigInt
Float32 Float
Float64 Double
TimestampSecond Timestamp_s, Timestamp_sec, Timestamp(0)
TimestampMillisecond Timestamp, Timestamp_ms , Timestamp(3)
TimestampMicroSecond Timestamp_us, Timestamp(6)
TimestampNanosecond Timestamp_ns, Timestamp(9)

在创建表时也可以使用这些别名类型。 例如,使用 Varchar 代替 String,使用 Double 代替 Float64,使用 Timestamp(0) 代替 TimestampSecond。

1. CREATE TABLE alias_types (
2. s TEXT,
3. i Double,
4. ts0 Timestamp(0) DEFAULT CURRENT_TIMESTAMP() TIME INDEX,
5. PRIMARY KEY(s)
6. );

日期和时间类型

除了在 GreptimeDB 中用作默认时间类型的 Timestamp 类型之外 GreptimeDB 还支持与 MySQL 和 PostgreSQL 兼容的 Date 和 DateTime 类型。

类型名称 描述 大小
Date 32 位日期值,表示自 UNIX Epoch 以来的天数 4 字节
DateTime 64 位日期时间值,表示自 UNIX Epoch 以来的毫秒数 8 字节

示例

创建表

1. CREATE TABLE data_types (
2. s STRING,
3. vbi BINARY,
4. b BOOLEAN,
5. tint INT8,
6. sint INT16,
7. i INT32,
8. bint INT64,
9. utint UINT8,
10. usint UINT16,
11. ui UINT32,
12. ubint UINT64,
13. f FLOAT32,
14. d FLOAT64,
15. dm DECIMAL(3, 2),
16. dt DATE,
17. dtt DATETIME,
18. ts0 TIMESTAMPSECOND,
19. ts3 TIMESTAMPMILLISECOND,
20. ts6 TIMESTAMPMICROSECOND,
21. ts9 TIMESTAMPNANOSECOND DEFAULT CURRENT_TIMESTAMP() TIME INDEX,
22. PRIMARY KEY(s));

描述表结构

1. DESC TABLE data_types;
1. +--------+----------------------+------+------+---------------------+---------------+
2. | Column | Type                 | Key  | Null | Default             | Semantic Type |
3. +--------+----------------------+------+------+---------------------+---------------+
4. | s      | String               | PRI  | YES  |                     | TAG           |
5. | vbi    | Binary               |      | YES  |                     | FIELD         |
6. | b      | Boolean              |      | YES  |                     | FIELD         |
7. | tint   | Int8                 |      | YES  |                     | FIELD         |
8. | sint   | Int16                |      | YES  |                     | FIELD         |
9. | i      | Int32                |      | YES  |                     | FIELD         |
10. | bint   | Int64                |      | YES  |                     | FIELD         |
11. | utint  | UInt8                |      | YES  |                     | FIELD         |
12. | usint  | UInt16               |      | YES  |                     | FIELD         |
13. | ui     | UInt32               |      | YES  |                     | FIELD         |
14. | ubint  | UInt64               |      | YES  |                     | FIELD         |
15. | f      | Float32              |      | YES  |                     | FIELD         |
16. | d      | Float64              |      | YES  |                     | FIELD         |
17. | dm     | Decimal(3, 2)        |      | YES  |                     | FIELD         |
18. | dt     | Date                 |      | YES  |                     | FIELD         |
19. | dtt    | DateTime             |      | YES  |                     | FIELD         |
20. | ts0    | TimestampSecond      |      | YES  |                     | FIELD         |
21. | ts3    | TimestampMillisecond |      | YES  |                     | FIELD         |
22. | ts6    | TimestampMicrosecond |      | YES  |                     | FIELD         |
23. | ts9    | TimestampNanosecond  | PRI  | NO   | current_timestamp() | TIMESTAMP     |
24. +--------+----------------------+------+------+---------------------+---------------+