InfluxDB 行协议参考
查看等效的 InfluxDB v2 文档: 行协议.
InfluxDB 行协议是一种基于文本的格式,用于将数据点写入 InfluxDB。
行协议语法
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
行协议接受换行符 \n
,并且对空白字符敏感。
行协议不支持在标签值或字段值中使用换行符 \n
。
语法描述
InfluxDB 行协议通知 InfluxDB 数据的度量、标签集、字段集和时间戳。
元素 | 可选/必需 | 描述 | 类型 (有关更多信息,请参阅 数据类型) |
---|---|---|---|
度量 | 必需 | 度量名称。InfluxDB 每个点接受一个度量。 | 字符串 |
标签集 | 可选 | 点的所有标签键值对。 | 标签键 和 标签值 都是字符串。 |
字段集 | 必需。点必须有至少一个字段。 | 点的所有字段键值对。 | 字段键 是字符串。 字段值 可以是浮点数、整数、字符串或布尔值。 |
时间戳 | 可选。如果未包含时间戳,InfluxDB 使用服务器的本地纳秒 UTC 时间戳。 | 数据点的时间戳。InfluxDB 每个点接受一个时间戳。 | Unix 纳秒时间戳。使用 InfluxDB API 指定替代精度。 |
性能提示
- 在将数据发送到 InfluxDB 之前,按标签键排序,以匹配来自 Go bytes.Compare 函数 的结果。
- 为了显著提高压缩,请使用可能的最粗精度 精度 为时间戳。
- 使用网络时间协议 (NTP) 在主机之间同步时间。InfluxDB 使用主机的本地 UTC 时间来分配数据的时间戳。如果主机的时钟没有与 NTP 同步,则主机写入 InfluxDB 的数据可能具有不准确的时间戳。
数据类型
数据类型 | 元素 | 描述 |
---|---|---|
浮点数 | 字段值 | 默认数值类型。IEEE-754 64 位浮点数(除了 NaN 或 +/- Inf)。示例:1 ,1.0 ,1.e+78 ,1.E+78 。 |
整数 | 字段值 | 有符号 64 位整数(-9223372036854775808 到 9223372036854775807)。指定整数时,在数字后面加上 i 。示例:1i 。 |
字符串 | 度量、标签键、标签值、字段键、字段值 | 长度限制 64KB。 |
布尔值 | 字段值 | 存储 TRUE 或 FALSE 值。 TRUE 写入语法: [t, T, true, True, TRUE] 。FALSE 写入语法: [f, F, false, False, FALSE] 。 |
时间戳 | 时间戳 | 自 1970 年 1 月 1 日 UTC 以来的一段时间的 Unix 时间。使用 InfluxDB API 指定替代精度。最小有效时间戳是 -9223372036854775806 或 1677-09-21T00:12:43.145224194Z 。最大有效时间戳是 9223372036854775806 或 2262-04-11T23:47:16.854775806Z 。 |
写入和查询的布尔语法
可接受的布尔语法在数据写入和数据查询中有所不同。更多信息,请参阅常见问题解答。
字段类型差异
在度量中,一个字段的类型不能在分片中不同,但可以在分片之间不同。
要了解字段值类型差异如何影响SELECT *
查询,请参阅InfluxDB如何处理跨分片的字段类型差异?。
示例
将字段值-1.234456e+78
作为浮点数写入InfluxDB
> INSERT mymeas value=-1.234456e+78
InfluxDB支持科学记数法指定的字段值。
将字段值1.0
作为浮点数写入InfluxDB
> INSERT mymeas value=1.0
将字段值1
作为浮点数写入InfluxDB
> INSERT mymeas value=1
将字段值1
作为整数写入InfluxDB
> INSERT mymeas value=1i
将字段值stringing along
作为字符串写入InfluxDB
> INSERT mymeas value="stringing along"
始终用双引号引用字符串字段值。更多关于引号的内容如下。
将字段值true
作为布尔值写入InfluxDB
> INSERT mymeas value=true
不要引用布尔字段值。以下语句将true
作为字符串字段值写入InfluxDB
> INSERT mymeas value="true"
尝试将字符串写入先前接受浮点数的字段
如果浮点数和字符串的戳存储在同一个分片
> INSERT mymeas value=3 1465934559000000000
> INSERT mymeas value="stringing along" 1465934559000000001
ERR: {"error":"field type conflict: input field \"value\" on measurement \"mymeas\" is type string, already exists as type float"}
如果浮点数和字符串的戳没有存储在同一个分片
> INSERT mymeas value=3 1465934559000000000
> INSERT mymeas value="stringing along" 1466625759000000000
>
引号、特殊字符和额外命名指南
引号
元素 | 双引号 | 单引号 |
---|---|---|
时间戳 | 从不 | 从不 |
度量、标签键、标签值、字段键 | 从不* | 从不* |
字段值 | 用双引号引用字符串字段值。不要用双引号引用浮点数、整数或布尔值。 | 从不 |
* InfluxDB行协议允许用户用双引号或单引号引用度量名、标签键、标签值和字段键。然而,它将假定双引号或单引号是名称、键或值的一部分。这可能会使查询语法复杂化(见下面的示例)。
示例
无效行协议 - 引号括起来的时间戳
> INSERT mymeas value=9 "1466625759000000000"
ERR: {"error":"unable to parse 'mymeas value=9 \"1466625759000000000\"': bad timestamp"}
双引号(或单引号)括起来的时间戳会引发bad timestamp
错误。
语义错误 - 引号括起来的布尔字段值
> INSERT mymeas value="true"
> SHOW FIELD KEYS FROM "mymeas"
name: mymeas
------------
fieldKey fieldType
value string
InfluxDB假定所有引号括起来的字段值都是字符串。
语义错误 - 引号括起来的度量名
> INSERT "mymeas" value=200
> SHOW MEASUREMENTS
name: measurements
------------------
name
"mymeas"
> SELECT * FROM mymeas
> SELECT * FROM "mymeas"
> SELECT * FROM "\"mymeas\""
name: "mymeas"
--------------
time value
2016-06-14T20:36:21.836131014Z 200
如果您在行协议中用双引号括起来度量,对该度量的任何查询都需要在FROM
子句中同时使用双引号和转义的双引号(\
)。
特殊字符
您必须使用反斜杠字符\
来转义以下特殊字符
在字符串字段值中,您必须转义
双引号:
\"
转义双引号。反斜杠字符:如果您使用多个反斜杠,它们必须被转义。InfluxDB解释反斜杠如下
\
或\\
被解释为\
\\\
或\\\\
被解释为\\
\\\\\
或\\\\\\
被解释为\\\
,依此类推
在标签键、标签值和字段键中,您必须转义
- 逗号
- 等号
- 空格
例如,\,
转义逗号。
- 在度量中,您必须转义
- 逗号
- 空格
您不需要转义其他特殊字符。
示例
写入包含特殊字符的点
> INSERT "measurement\ with\ quo⚡️es\ and\ emoji",tag\ key\ with\ sp🚀ces=tag\,value\,with"commas" field_k\ey="string field value, only \" need be esc🍭ped"
系统写入一个度量是"measurement with quo⚡️es and emoji"
,标签键是tag key with sp🚀ces
,标签值是tag,value,with"commas"
,字段键是field_k\ey
,字段值是string field value, only " need be esc🍭ped
的点。
额外命名指南
行首的#
是行协议中的有效注释字符。InfluxDB会忽略直到下一个换行符\n
的所有后续字符。
度量名称、标签键、标签值、字段键和字段值是区分大小写的。
InfluxDB行协议接受InfluxQL关键字作为标识符名称。通常,我们建议在您的模式中避免使用InfluxQL关键字,因为它在查询数据时可能导致混淆。
注意:避免使用保留键
_field
和_measurement
。如果这些键作为标签或字段键包含在内,则相关的点将被丢弃。
关键字time
是一个特殊情况。time
可以是连续查询名称、数据库名称、度量名称、保留策略名称、订阅名称和用户名称。在这些情况下,time
在查询中不需要双引号。time
不能作为字段键或标签键;InfluxDB拒绝将time
作为字段键或标签键的写入,并返回错误。有关更多信息,请参阅常见问题解答。
InfluxDB行协议实践
要了解如何将行协议写入数据库,请参阅工具。
重复点
一个点由度量名称、标签集、字段集和时间戳唯一标识。
如果您将一个点写入具有与现有点匹配的时间戳的序列,则字段集成为旧字段集和新字段集的并集,冲突倾向于新字段集。
有关此行为的完整示例以及如何避免它,请参阅InfluxDB如何处理重复点?
重复键
如果您在度量中有一个具有相同名称的标签键和字段键,则其中一个键将在查询结果中返回时附加_1
(并在Chronograf的列标题中)。例如,location
和location_1
。要查询重复键,请删除_1
并在您的查询中使用InfluxQL的::tag
或::field
语法,例如
SELECT "location"::tag, "location"::field FROM "database_name"."retention_policy"."measurement"
这个页面有用吗?
感谢您的反馈!