数据类型
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. +--------+----------------------+------+------+---------------------+---------------+
