SQL 参考

数据类型

师成师成· 更新于 2026-09-28· 阅读 10 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

数据类型

DataFusion 使用 Arrow,因而也使用 Arrow 类型系统来执行查询。来自 sqlparser-rs 的 SQL 类型会按照下表映射为 Arrow 数据类型。这种映射发生在使用 CREATE EXTERNAL TABLE 命令定义架构时,或执行 SQL CAST 操作时。

关于扩展类型和自定义元数据的背景知识,请参阅 Implementing User Defined Types and Custom Metadata in DataFusion 博文。

你可以使用 arrow_typeof 函数查看任意 SQL 表达式所对应的 Arrow 类型。例如:

select arrow_typeof(interval '1 month');
+---------------------------------------------------------------------+
| arrow_typeof(IntervalMonthDayNano("79228162514264337593543950336")) |
+---------------------------------------------------------------------+
| Interval(MonthDayNano)                                              |
+---------------------------------------------------------------------+

你可以使用 arrow_cast 函数将 SQL 表达式转换为指定的 Arrow 类型。例如,要将 now() 的输出转换为秒精度的 Timestamp:

select arrow_cast(now(), 'Timestamp(s)') as "now()";
+---------------------+
| now()               |
+---------------------+
| 2025-10-24T20:02:45 |
+---------------------+

旧版语法依然有效:

select arrow_cast(now(), 'Timestamp(Second, None)') as "now()";
+---------------------+
| now()               |
+---------------------+
| 2023-03-03T17:19:21 |
+---------------------+

字符类型

SQL 数据类型Arrow 数据类型
CHARUtf8View
VARCHARUtf8View
TEXTUtf8View
STRINGUtf8View
CHARACTER VARYINGUtf8View
CHAR VARYINGUtf8View
NVARCHARUtf8View

默认情况下,字符串类型会映射为 Utf8View。可以通过 datafusion.sql_parser.map_string_types_to_utf8view 设置项进行配置。当该设置为 false 时,字符串类型将改为映射为 Utf8。

请注意,CHAR、VARCHAR、STRING、CHARACTER VARYING、CHAR VARYING 和 NVARCHAR 可以选择性地指定最大长度(例如 VARCHAR(n))。不过,该限制会被忽略。若希望在传入长度时抛出错误,请将 datafusion.sql_parser.support_varchar_with_length 设置为 false。

数值类型

SQL 数据类型Arrow 数据类型
TINYINTInt8
SMALLINT 或 INT2Int16
INT 或 INTEGER 或 INT4Int32
BIGINT 或 INT8Int64
TINYINT UNSIGNED 或 UTINYINTUInt8
SMALLINT UNSIGNED 或 INT2 UNSIGNED 或 USMALLINTUInt16
INT UNSIGNED 或 INTEGER UNSIGNED 或 INT4 UNSIGNEDUInt32
BIGINT UNSIGNED 或 INT8 UNSIGNED 或 UBIGINTUInt64
FLOAT 或 FLOAT4 或 REALFloat32
DOUBLE 或 DOUBLE PRECISION 或 FLOAT8Float64
DECIMAL(precision, scale) 或 NUMERIC(precision, scale),其中 precision ≤ 38Decimal128(precision, scale)
DECIMAL(precision, scale) 或 NUMERIC(precision, scale),其中 precision > 38Decimal256(precision, scale)

DECIMAL 类型支持的最大精度为 76。

日期/时间类型

SQL 数据类型Arrow 数据类型
DATEDate32
TIMETime64(Nanosecond)
TIMESTAMPTimestamp(Nanosecond, None)
INTERVALInterval(IntervalMonthDayNano)

布尔类型

SQL 数据类型Arrow 数据类型
BOOLEAN 或 BOOLBoolean

二进制类型

SQL 数据类型Arrow 数据类型
BYTEABinary
BLOBBinary
BINARYBinary
VARBINARYBinary
BYTESBinary

你可以使用十六进制字符串字面量(例如 X'1234')创建二进制字面量,它会生成一个包含两个字节 0x12 和 0x34 的 Binary 值。

嵌套类型

SQL 数据类型Arrow 数据类型
ARRAY<T> 或 T[]List(T)
T[n]FixedSizeList(n x T)
MAP(k, v)Map(k, v)
STRUCT<[c0] T0[, ..., [cn] Tn]>Struct(c0: T0[, ..., cn: Tn])

使用 STRUCT 定义的列要求所有行具有相同的 schema,而 MAP 则没有这样的限制。

还要注意,STRUCT 可以在不定义字段名的情况下声明。在这种情况下,字段名将被设置为 c0、c1、…、cn。

不支持的 SQL 类型

SQL 数据类型Arrow 数据类型
UUID尚不支持
CLOB尚不支持
REGCLASS尚不支持
CUSTOM尚不支持
ENUM尚不支持
SET尚不支持
DATETIME尚不支持

评论

登录后参与评论

正在加载评论…