Documentation

Line protocol reference

InfluxDB Clustered uses line protocol to write data points. It is a text-based format that provides the table, tag set, field set, and timestamp of a data point.

// Syntax
<table>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]

// Example
myTable,tag1=value1,tag2=value2 fieldKey="fieldValue" 1556813561098000000

Lines separated by the newline character \n represent a single point in InfluxDB. Line protocol is whitespace-sensitive.

Line protocol does not support the newline character \n in tag or field values.

Elements of line protocol

myTable,tag1=val1,tag2=val2 field1="v1",field2=1i 0000000000000000000

Table

(Required) The table name. InfluxDB accepts one table per point. Table names are case-sensitive and subject to naming restrictions.

Data type: String

If familiar with previous InfluxDB versions, “table” is synonymous with “measurement.”

Tag set

(Optional) All tag key-value pairs for the point. Key-value relationships are denoted with the = operand. Multiple tag key-value pairs are comma-delimited. Tag keys and tag values are case-sensitive. Tag keys are subject to naming restrictions. Tag values cannot be empty; instead, omit the tag from the tag set.

Key data type: String
Value data type: String

Field set

(Required) All field key-value pairs for the point. Points must have at least one field. Field keys and string values are case-sensitive. Field keys are subject to naming restrictions.

Key data type: String
Value data type: Float | Integer | UInteger | String | Boolean

Always double quote string field values. More on quotes below.

tableName fieldKey="field string value" 1556813561098000000

Timestamp

(Optional) The Unix timestamp for the data point. InfluxDB accepts one timestamp per point. If no timestamp is provided, InfluxDB uses the system time (UTC) of its host machine.

Data type: Unix timestamp

Important notes about timestamps

  • To ensure a data point includes the time a metric is observed (not received by InfluxDB), include the timestamp.
  • If your timestamps are not in nanoseconds, specify the precision of your timestamps when writing the data to InfluxDB Clustered.

Whitespace

Whitespace in line protocol determines how InfluxDB interprets the data point. The first unescaped space delimits the table and the tag set from the field set. The second unescaped space delimits the field set from the timestamp.

myTable,tag1=val1,tag2=val2 field1="v1",field2=1i 0000000000000000000

Data types and format

Float

IEEE-754 64-bit floating-point numbers. Default numerical type. InfluxDB supports scientific notation in float field values.

Float field value examples
myTable fieldKey=1.0
myTable fieldKey=1
myTable fieldKey=-1.234456e+78

Integer

Signed 64-bit integers. Trailing i on the number specifies an integer.

Minimum integerMaximum integer
-9223372036854775808i9223372036854775807i
Integer field value examples
myTable fieldKey=1i
myTable fieldKey=12485903i
myTable fieldKey=-12485903i

UInteger

Unsigned 64-bit integers. Trailing u on the number specifies an unsigned integer.

Minimum uintegerMaximum uinteger
0u18446744073709551615u
UInteger field value examples
myTable fieldKey=1u
myTable fieldKey=12485903u

String

Plain text string. Length limit 64KB.

String example
# String table name, field key, and field value
myTable fieldKey="this is a string"

Boolean

Stores true or false values.

Boolean valueAccepted syntax
Truet, T, true, True, TRUE
Falsef, F, false, False, FALSE
Boolean field value examples
myTable fieldKey=true
myTable fieldKey=false
myTable fieldKey=t
myTable fieldKey=f
myTable fieldKey=TRUE
myTable fieldKey=FALSE

Do not quote boolean field values. Quoted field values are interpreted as strings.

Unix timestamp

Unix timestamp in a specified precision. Default precision is nanoseconds (ns).

Minimum timestampMaximum timestamp
-92233720368547758069223372036854775806
Unix timestamp example
myTableName fieldKey="fieldValue" 1556813561098000000

Quotes

Line protocol supports single and double quotes as described in the following table:

ElementDouble quotesSingle quotes
TableLimited *Limited *
Tag keyLimited *Limited *
Tag valueLimited *Limited *
Field keyLimited *Limited *
Field valueStrings onlyNever
TimestampNeverNever

* Line protocol accepts double and single quotes in table names, tag keys, tag values, and field keys, but interprets them as part of the name, key, or value.

Special Characters

Line protocol supports special characters in string elements. In the following contexts, it requires escaping certain characters with a backslash (\):

ElementEscape characters
TableComma, Space
Tag keyComma, Equals Sign, Space
Tag valueComma, Equals Sign, Space
Field keyComma, Equals Sign, Space
Field valueDouble quote, Backslash

You do not need to escape other special characters.

Examples of special characters in line protocol
# Table name with spaces
my\ Table fieldKey="string value"

# Double quotes in a string field value
myTable fieldKey="\"string\" within a string"

# Tag keys and values with spaces
myTable,tag\ Key1=tag\ Value1,tag\ Key2=tag\ Value2 fieldKey=100

# Emojis
myTable,tagKey=🍭 fieldKey="Launch 🚀" 1556813561098000000

Escaping backslashes

Line protocol supports both literal backslashes and backslashes as an escape character. With two contiguous backslashes, the first is interpreted as an escape character. For example:

BackslashesInterpreted as
\\
\\\
\\\\\
\\\\\\
\\\\\\\\
\\\\\\\\\

Comments

Line protocol interprets # at the beginning of a line as a comment character and ignores all subsequent characters until the next newline \n.

# This is a comment
myTable fieldKey="string value" 1556813561098000000

Naming restrictions

Table names, tag keys, and field keys are alphanumeric and must begin with a letter or a number. They can contain dashes (-) and underscores (_).

Duplicate points

A point is uniquely identified by the table name, tag set, and timestamp. If you submit line protocol with the same table, tag set, and timestamp, but with a different field set, the field set becomes the union of the old field set and the new field set, where any conflicts favor the new field set.

Duplicate point overwrites are non-deterministic

Overwriting duplicate points (same table, tag set, and timestamp) is not a reliable way to maintain a last-value view. When duplicate points are flushed together, write ordering is not guaranteed—a prior write may “win.” See Anti-patterns to avoid and Recommended patterns below.

To reliably maintain a last-value view of your data, use one of these append-only patterns:

Write each change as a new point with a unique timestamp using the actual event time. Query for the most recent point to get the current value.

Line protocol example:

device_status,device_id=sensor01 status="active",temperature=72.5 1700000000000000000
device_status,device_id=sensor01 status="active",temperature=73.1 1700000300000000000
device_status,device_id=sensor01 status="inactive",temperature=73.1 1700000600000000000

SQL query to get latest state:

SELECT
  device_id,
  status,
  temperature,
  time
FROM device_status
WHERE time >= now() - INTERVAL '7 days'
  AND device_id = 'sensor01'
ORDER BY time DESC
LIMIT 1

InfluxQL query to get latest state:

SELECT LAST(status), LAST(temperature)
FROM device_status
WHERE device_id = 'sensor01'
  AND time >= now() - 7d
GROUP BY device_id

Append-only with change tracking field

If you need to filter by “changes since a specific time,” add a dedicated last_change_timestamp field.

Line protocol example:

device_status,device_id=sensor01 status="active",temperature=72.5,last_change_timestamp=1700000000000000000i 1700000000000000000
device_status,device_id=sensor01 status="active",temperature=73.1,last_change_timestamp=1700000300000000000i 1700000300000000000
device_status,device_id=sensor01 status="inactive",temperature=73.1,last_change_timestamp=1700000600000000000i 1700000600000000000

SQL query to get changes since a specific time:

SELECT
  device_id,
  status,
  temperature,
  time
FROM device_status
WHERE last_change_timestamp >= 1700000000000000000
ORDER BY time DESC

Anti-patterns to avoid

The following patterns will produce non-deterministic results when duplicate points are flushed together:

Don’t overwrite the same (time, tags) point

If points with the same time and tag set are flushed to storage together, any of the values might be retained. For example, don’t do this:

-- All writes use the same timestamp
device_status,device_id=sensor01 status="active",temperature=72.5 1700000000000000000
device_status,device_id=sensor01 status="active",temperature=73.1 1700000000000000000
device_status,device_id=sensor01 status="inactive",temperature=73.1 1700000000000000000

#### Don't add a field while overwriting data (time, tags)

Adding a field doesn't make points unique.
Points with the same time and tag set are still considered duplicates--for example,
**don't do this**:

```text
-- All writes use the same timestamp, but add a version field
device_status,device_id=sensor01 status="active",temperature=72.5,version=1i 1700000000000000000
device_status,device_id=sensor01 status="active",temperature=73.1,version=2i 1700000000000000000
device_status,device_id=sensor01 status="inactive",temperature=73.1,version=3i 1700000000000000000

#### Don't rely on write delays to force ordering

Delays don't guarantee that duplicate points won't be flushed together.
The flush interval depends on buffer size, ingestion rate, and system load.

For example, **don't do this**:

```text
-- Writing with delays between each write
device_status,device_id=sensor01 status="active" 1700000000000000000
# Wait 10 seconds...
device_status,device_id=sensor01 status="inactive" 1700000000000000000





### Performance considerations

#### Row count and query performance

Append-only patterns increase row counts compared to overwriting duplicate points.
To maintain query performance:

1. **Limit query time ranges**: Query only the time range you need (for example, last 7 days for current state)
2. **Use time-based filters**: Always include a `WHERE time >=` clause to narrow the query scope
3. **Consider shorter retention**: For last-value views, use a dedicated database with shorter retention

**Example - Good query with time filter**:

```sql
SELECT device_id, status, temperature, time
FROM device_status
WHERE time >= now() - INTERVAL '7 days'
ORDER BY time DESC

Example - Avoid querying entire table:

-- Don't do this - queries all historical data
SELECT device_id, status, temperature, time
FROM device_status
ORDER BY time DESC

Storage and cache bandwidth

Append-only patterns create more data points, which results in larger Parquet files. This can increase cache bandwidth usage when querying large time ranges.

Mitigation strategies:

  1. Narrow time filters: Query only same-day partitions when possible
  2. Use partition-aligned time ranges: Queries that align with partition boundaries are more efficient
  3. Consider aggregation: For historical analysis, use downsampled or aggregated data instead of raw points

Example - Partition-aligned query:

SELECT device_id, status, temperature, time
FROM device_status
WHERE time >= '2025-11-20T00:00:00Z'
  AND time < '2025-11-21T00:00:00Z'
ORDER BY time DESC

Was this page helpful?

Thank you for your feedback!


New in InfluxDB 3.7

Key enhancements in InfluxDB 3.7 and the InfluxDB 3 Explorer 1.5.

See the Blog Post

InfluxDB 3.7 is now available for both Core and Enterprise, landing alongside version 1.5 of the InfluxDB 3 Explorer UI. This release focuses on giving developers faster visibility into what their system is doing with one-click monitoring, a streamlined installation pathway, and broader updates that simplify day-to-day operations.

For more information, check out:

InfluxDB Docker latest tag changing to InfluxDB 3 Core

On February 3, 2026, the latest tag for InfluxDB Docker images will point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in your Docker deployments.

If using Docker to install and run InfluxDB, the latest tag will point to InfluxDB 3 Core. To avoid unexpected upgrades, use specific version tags in your Docker deployments. For example, if using Docker to run InfluxDB v2, replace the latest version tag with a specific version tag in your Docker pull command–for example:

docker pull influxdb:2