TDengine 数据类型与精度完全指南:时间戳、字符串、DECIMAL 与 JSON 标签详解

发布时间:2026/9/12 13:43:01
TDengine 数据类型与精度完全指南:时间戳、字符串、DECIMAL 与 JSON 标签详解 TDengine 数据类型与精度完全指南时间戳、字符串、DECIMAL 与 JSON 标签详解【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengineTDengine 是专为工业物联网IIoT场景设计的高性能时序数据库。本指南以 TDengine SQL 数据类型与精度 官方文档为主体系统讲解 TDengine 支持的全部数据类型、时间单位与时间戳规则、字符串与空间类型、高精度 DECIMAL、BLOB 大对象、JSON 标签以及各类常量形式。读完本文你将能够为普通表、子表、超级表正确选型建列精确控制数据库时间精度并熟练使用 JSON 标签、DECIMAL 高精度数值等进阶能力。数据类型总览在 TDengine 中普通表、子表与超级表共享同一套数据类型体系。部分类型在用途上有限制——例如JSON只能用作标签列、DECIMAL目前仅支持普通列——具体见下文各节。类型存储占用说明TIMESTAMP8 字节时间戳。默认精度为毫秒可在创建数据库时设置为微秒或纳秒。BOOL1 字节布尔值。TINYINT1 字节有符号单字节整数范围[-128, 127]。TINYINT UNSIGNED1 字节无符号单字节整数范围[0, 255]。SMALLINT2 字节有符号短整数范围[-32768, 32767]。SMALLINT UNSIGNED2 字节无符号短整数范围[0, 65535]。INT4 字节有符号整数范围[-2^31, 2^31-1]。INT UNSIGNED4 字节无符号整数范围[0, 2^32-1]。BIGINT8 字节有符号长整数范围[-2^63, 2^63-1]。BIGINT UNSIGNED8 字节无符号长整数范围[0, 2^64-1]。FLOAT4 字节单精度浮点数约 6–7 位有效数字范围约[-3.4E38, 3.4E38]。DOUBLE8 字节双精度浮点数约 15–16 位有效数字范围约[-1.7E308, 1.7E308]。BINARY自定义单字节字符串仅建议存放 ASCII 可打印字符。VARCHAR自定义BINARY的别名。NCHAR自定义多字节字符串适合中文等多字节字符。VARBINARY自定义变长二进制数据。GEOMETRY自定义空间类型支持二维POINT、LINESTRING、POLYGON。DECIMAL8 或 16 字节高精度数值类型取值范围取决于precision与scale。BLOB最大 4 MB大对象二进制数据。JSON自定义JSON 标签类型只能用于标签列。从源码结构看这些类型在底层都有对应的类型常量定义例如 include/client/taos.h 中TSDB_DATA_TYPE_NULL到TSDB_DATA_TYPE_DECIMAL64依次编号其中BINARY是VARCHAR的别名宏GEOMETRY20、DECIMAL6421是较新加入的类型而 include/common/ttypes.h 中的宏则按类型家族做了归类例如IS_DECIMAL_TYPE同时涵盖DECIMAL与DECIMAL64IS_VAR_DATA_TYPE涵盖VARCHAR、VARBINARY、NCHAR、JSON、GEOMETRY、BLOB等所有变长类型这为后续行存格式、函数实现中的统一处理提供了基础。通用限制单行最大长度为 48 KB自 3.0.5.0 版本起为 64 KB。每个BINARY、NCHAR、GEOMETRY或VARBINARY列还会额外占用 2 字节存储。BINARY、VARBINARY、GEOMETRY数据列的最大长度为 65,517 字节作为标签列时为 16,382 字节。单个BLOB列值的最大长度为 4,194,304 字节。JSON只能用于标签列且一旦使用 JSON 标签全表只能有一个标签列。DECIMAL仅支持普通列暂不支持标签列。关于数据库、表、列与标签的命名限制参见 Names Limits。时间单位在 TDengine SQL 中凡需要表达时间长度的地方时间加减运算、INTERVAL、EVERY、SLIDING等都使用单个字符后缀表示单位。支持的时间单位由小到大如下单位含义说明b纳秒最小精度单位仅在数据库精度为纳秒时有意义。u微秒仅在数据库精度为微秒或纳秒时有意义。a毫秒数据库默认精度。s秒m分钟h小时d天w周固定为 7 天。n自然月日历单位只允许出现在INTERVAL窗口不能用于时间算术、EVERY、SURROUND等。q自然季度日历单位等于 3 个自然月只允许出现在INTERVAL窗口。y自然年日历单位只允许出现在INTERVAL窗口。单位字母不区分大小写如1S与1s等价。关于时区与自然单位的完整语义参见 Timezone and Natural Time Units。时间戳时间戳是时序数据的主键。建表、写数据、查历史通常都要指定时间戳。时间字符串格式为YYYY-MM-DD HH:mm:ss.MS默认分辨率为毫秒例如2017-08-12 18:25:58.128。NOW表示客户端当前时间。写入时若时间戳为NOW则使用提交客户端的当前时间。时间戳也可以是长整数表示自 UTC1970-01-01 00:00:00起的流逝时间其单位跟随数据库精度毫秒、微秒或纳秒。时间表达式支持加减运算例如NOW - 2h表示当前时间前 2 小时时间单位的含义见 时间单位。时间戳默认精度为毫秒可在创建数据库时通过PRECISION设为微秒或纳秒CREATE DATABASE db_name PRECISION ns;完整的PRECISION用法参见 Create Database。字符串、二进制与空间类型BINARY 与 VARCHARBINARY存放单字节字符串VARCHAR是BINARY的别名。BINARY/VARCHAR中只应存放 ASCII 可打印字符中文字符请使用NCHAR。强行把中文写入BINARY有时也能读写成功但由于缺乏字符集信息极易出现乱码或数据损坏。使用BINARY或VARCHAR时必须指定长度如BINARY(20)最多存储 20 个单字节字符。字符串用单引号包裹字符串内的单引号可用\转义。NCHARNCHAR存放包含多字节字符如中文的字符串。每个NCHAR字符占用 4 字节。使用时应指定字符长度如NCHAR(10)最多存储 10 个NCHAR字符写入超过声明长度的字符串会报错。VARBINARYVARBINARY存放变长二进制数据。写入方式包括通过 SQL 或 schemaless 写入时转换为以\x开头的字符串或通过STMT绑定二进制数据。查询结果显示为以\x开头的十六进制字符串。GEOMETRYGEOMETRY存放二维空间对象支持POINT、LINESTRING、POLYGON。其长度计算规则如下语法最小长度最大长度每增加一组坐标POINT(1.0 1.0)2121无LINESTRING(1.0 1.0, 2.0 2.0)92*1694094*1616POLYGON((1.0 1.0, 2.0 2.0, 1.0 1.0))133*16134094*1616高精度数值类型 DECIMALDECIMAL用于存放高精度数值。定义语法为DECIMAL(18, 2)、DECIMAL(38, 10)其中precision是最大有效数字位数scale是最大小数位数。例如DECIMAL(8, 4)表示范围[-9999.9999, 9999.9999]。定义DECIMAL时precision取值[1, 38]scale取值[0, precision]scale为 0 表示仅整数。scale可以省略默认 0即DECIMAL(18)等价于DECIMAL(18, 0)。存储规则precision≤ 18 时占用 8 字节对应DECIMAL64precision在(18, 38]时占用 16 字节对应DECIMAL。从源码实现看include/client/taos.h 中TSDB_DATA_TYPE_DECIMAL与TSDB_DATA_TYPE_DECIMAL64是两个独立类型常量而 source/libs/function/src/detail/tavgfunction.c 等聚合函数实现对两种 DECIMAL 类型分别处理并在求和、求平均等运算中检测溢出后返回TSDB_CODE_DECIMAL_OVERFLOW。SQL 中直接写数值即可写入DECIMAL。超过类型最大值会报DECIMAL_OVERFLOW错误数值在小数位数上超过scale时按四舍五入处理。例如类型DECIMAL(10, 2)写入10.987实际存储为10.99。DECIMAL支持 SQL 与STMT2写入暂不支持 schemaless 写入。整数类型与DECIMAL的运算会先把整数转换为DECIMALDECIMAL与DOUBLE、FLOAT、VARCHAR、NCHAR的运算则先转换为DOUBLE。查询DECIMAL表达式时若中间结果超出当前类型最大值会返回DECIMAL OVERFLOW错误。大对象类型 BLOBBLOB存放较大二进制数据最大长度 4,194,304 字节。写入方式通过 SQL 或STMT2写入或写成以\x开头的字符串。通过 shell 查询时BLOB显示为以\x开头的十六进制字符串。限制BLOB只允许出现在普通数据列且一张表最多一个BLOB列BLOB列不支持条件过滤虚拟表、流计算及相关功能中不支持BLOB。JSON 标签JSON只能用于标签列且一张表只能有一个标签列即只能有一个 JSON 标签。基本语法创建 JSON 标签CREATE STABLE s1 (ts TIMESTAMP, v1 INT) TAGS (info JSON); CREATE TABLE s1_1 USING s1 TAGS ({k1: v1});使用 JSON 取值运算符-SELECT * FROM s1 WHERE info-k1 v1; SELECT info-k1 FROM s1;使用CONTAINS判断 JSON key 是否存在SELECT * FROM s1 WHERE info CONTAINS k2; SELECT * FROM s1 WHERE info CONTAINS k1;从语法实现看source/libs/parser/inc/sql.y 将JSON解析为TSDB_DATA_TYPE_JSON类型-对应内部操作符OP_TYPE_JSON_GET_VALUECONTAINS对应OP_TYPE_JSON_CONTAINS可见 JSON 标签的取值与包含判断在 SQL 层有完整的语法与执行支持。支持的操作WHERE中支持MATCH、NMATCH、BETWEEN ... AND、LIKE、AND、OR、IS NULL、IS NOT NULL不支持IN。SELECT * FROM s1 WHERE info-k1 MATCH v*; SELECT * FROM s1 WHERE info-k1 LIKE v% AND info CONTAINS k2; SELECT * FROM s1 WHERE info IS NULL; SELECT * FROM s1 WHERE info-k1 IS NOT NULL;JSON 标签可以出现在GROUP BY、ORDER BY、JOIN、UNION ALL以及子查询中例如GROUP BY info-key。支持DISTINCT。支持 JSON 标签值的整体覆盖写入。支持 JSON 标签重命名。不支持新增/删除 JSON 标签也不支持修改 JSON 标签列的宽度。其他约束JSON key 长度不能超过 256 字节且必须是可打印 ASCII整个 JSON 字符串长度不能超过 4096 字节。输入可以是空值、\t、 或NULL也可以是对象非空字符串、布尔值、数组不允许作为整个输入。对象可以为{}若对象为{}整个 JSON 字符串视为空。key 可以为若是空字符串 key该键值对被忽略。值可以是数字int/double、字符串、bool 或 null暂不支持数组和嵌套。若出现两个相同的 key以第一个为准。JSON 字符串内的转义序列暂不支持。查询不存在的 key 返回 NULL。当 JSON 标签是子查询结果时外层查询无法继续解析该 JSON 字符串。以下写法不被支持SELECT jtag-key FROM (SELECT jtag FROM stable); SELECT jtag-key FROM (SELECT jtag FROM stable) WHERE jtag-key 0;常量TDengine 支持以下常量形式整数字面量如123、123、-123类型为BIGINT。超出BIGINT范围的值会被截断为BIGINT。浮点字面量如123.45类型为DOUBLE。科学计数法字面量如1.2E3类型为DOUBLE。字符串字面量如abc或abc类型为BINARY长度为实际字符数。字符串内的单引号用\转义双引号用\转义。时间戳字面量如TIMESTAMP 2017-08-12 18:25:58.128类型为TIMESTAMP。字符串必须符合YYYY-MM-DD HH:mm:ss.MS格式分辨率跟随当前数据库。布尔字面量TRUE或FALSE类型为BOOL。空值字面量空字符串、制表符、空格或NULL可用于任何类型。SQL 中数值根据小数点或科学计数法判断为整数或浮点数。注意溢出问题9999999999999999999会超过长整数上界而9999999999999999999.0是合法的浮点数。总结TDengine 的数据类型体系围绕时序场景设计TIMESTAMP作为主键支撑按时间写入与查询PRECISION可在建库时从毫秒扩展到微秒、纳秒BINARY/NCHAR覆盖 ASCII 与多字节字符串VARBINARY/BLOB覆盖二进制与大对象DECIMAL为金融类精确计算场景提供高精度数值JSON标签则让超级表可以在不修改表结构的前提下承载半结构化的标签信息。在实际建模时建议结合行长度上限48 KB/64 KB、各类型存储占用与标签/数据列的位置限制为每一列选择最小且够用的类型从而在保证功能的前提下获得更好的存储与查询效率。【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考