| # IoTDB Data Types Support |
| |
| This document describes the complete set of IoTDB data types supported by the Node.js client, based on the official Apache TSFile type definitions. |
| |
| ## Supported Data Types |
| |
| The IoTDB Node.js client supports all standard IoTDB data types as defined in Apache TSFile: |
| |
| | Type Code | Type Name | Description | JavaScript Type | Storage Size | |
| |-----------|-----------|-------------|-----------------|--------------| |
| | 0 | BOOLEAN | Boolean value | `boolean` | 1 byte | |
| | 1 | INT32 | 32-bit signed integer | `number` | 4 bytes | |
| | 2 | INT64 | 64-bit signed integer | `bigint` | 8 bytes | |
| | 3 | FLOAT | 32-bit floating point | `number` | 4 bytes | |
| | 4 | DOUBLE | 64-bit floating point | `number` | 8 bytes | |
| | 5 | TEXT | UTF-8 encoded text | `string` | Variable (4-byte length + content) | |
| | 6 | VECTOR | Vector data (not yet implemented) | - | - | |
| | 7 | UNKNOWN | Unknown type (reserved) | - | - | |
| | 8 | TIMESTAMP | Timestamp (milliseconds) | `Date` | 8 bytes | |
| | 9 | DATE | Date (days since epoch) | `Date` | 4 bytes | |
| | 10 | BLOB | Binary data | `Buffer` | Variable (4-byte length + content) | |
| | 11 | STRING | UTF-8 encoded string | `string` | Variable (4-byte length + content) | |
| | 12 | OBJECT | Object type (reserved) | - | - | |
| |
| **Note**: Types 0-5, 8-11 are fully supported. Types 6, 7, and 12 are reserved for future use. |
| |
| ## Reference |
| |
| Type definitions are based on: |
| - [Apache TSFile TSDataType.java](https://github.com/apache/tsfile/blob/develop/java/common/src/main/java/org/apache/tsfile/enums/TSDataType.java) |
| - [Apache IoTDB C# Client Constants](https://github.com/apache/iotdb-client-csharp/blob/main/src/Apache.IoTDB/IoTDBConstants.cs) |
| |
| ## Usage Examples |
| |
| ### Creating Timeseries |
| |
| ```typescript |
| import { Session } from '@iotdb/client'; |
| |
| const session = new Session({ |
| host: 'localhost', |
| port: 6667, |
| username: 'root', |
| password: 'root' |
| }); |
| |
| await session.open(); |
| |
| // Create database |
| await session.executeNonQueryStatement('CREATE DATABASE root.test'); |
| |
| // Create timeseries with different data types |
| await session.executeNonQueryStatement( |
| 'CREATE TIMESERIES root.test.device1.boolean_sensor WITH DATATYPE=BOOLEAN, ENCODING=PLAIN' |
| ); |
| |
| await session.executeNonQueryStatement( |
| 'CREATE TIMESERIES root.test.device1.int32_sensor WITH DATATYPE=INT32, ENCODING=RLE' |
| ); |
| |
| await session.executeNonQueryStatement( |
| 'CREATE TIMESERIES root.test.device1.float_sensor WITH DATATYPE=FLOAT, ENCODING=RLE' |
| ); |
| |
| await session.executeNonQueryStatement( |
| 'CREATE TIMESERIES root.test.device1.text_sensor WITH DATATYPE=TEXT, ENCODING=PLAIN' |
| ); |
| ``` |
| |
| ### Inserting Data with All Types |
| |
| ```typescript |
| const now = Date.now(); |
| |
| const tablet = { |
| deviceId: 'root.test.device1', |
| measurements: [ |
| 'boolean_sensor', |
| 'int32_sensor', |
| 'int64_sensor', |
| 'float_sensor', |
| 'double_sensor', |
| 'text_sensor' |
| ], |
| dataTypes: [0, 1, 2, 3, 4, 5], // BOOLEAN, INT32, INT64, FLOAT, DOUBLE, TEXT |
| timestamps: [now, now + 1, now + 2], |
| values: [ |
| [true, 100, 1000n, 1.23, 4.56, 'hello'], |
| [false, 200, 2000n, 2.34, 5.67, 'world'], |
| [true, 300, 3000n, 3.45, 6.78, 'test'], |
| ], |
| }; |
| |
| await session.insertTablet(tablet); |
| ``` |
| |
| ### Working with BLOB Data |
| |
| ```typescript |
| // Insert BLOB data |
| const tablet = { |
| deviceId: 'root.test.device1', |
| measurements: ['blob_sensor'], |
| dataTypes: [10], // BLOB (type code 10) |
| timestamps: [Date.now()], |
| values: [ |
| [Buffer.from([0x01, 0x02, 0x03, 0x04])], |
| ], |
| }; |
| |
| await session.insertTablet(tablet); |
| |
| // Query BLOB data |
| const result = await session.executeQueryStatement( |
| 'SELECT blob_sensor FROM root.test.device1' |
| ); |
| |
| // Result will contain Buffer objects |
| const blobData = result.rows[0][1]; // Buffer |
| console.log(blobData); // <Buffer 01 02 03 04> |
| ``` |
| |
| ### Working with TIMESTAMP and DATE |
| |
| ```typescript |
| // TIMESTAMP stores millisecond precision, DATE stores day precision |
| const tablet = { |
| deviceId: 'root.test.device1', |
| measurements: ['timestamp_sensor', 'date_sensor'], |
| dataTypes: [8, 9], // TIMESTAMP=8, DATE=9 |
| timestamps: [Date.now()], |
| values: [ |
| [new Date('2024-01-15T10:30:00Z'), new Date('2024-01-15')], |
| ], |
| }; |
| |
| await session.insertTablet(tablet); |
| |
| // Query returns Date objects |
| const result = await session.executeQueryStatement( |
| 'SELECT timestamp_sensor, date_sensor FROM root.test.device1' |
| ); |
| |
| const timestampValue = result.rows[0][1]; // Date object with time |
| const dateValue = result.rows[0][2]; // Date object (day precision) |
| ``` |
| |
| ### Query Results with All Types |
| |
| ```typescript |
| const result = await session.executeQueryStatement( |
| 'SELECT * FROM root.test.device1' |
| ); |
| |
| for (const row of result.rows) { |
| console.log({ |
| timestamp: row[0], // bigint |
| boolean: row[1], // boolean |
| int32: row[2], // number |
| int64: row[3], // bigint |
| float: row[4], // number |
| double: row[5], // number |
| text: row[6], // string |
| }); |
| } |
| ``` |
| |
| ## Type Conversions |
| |
| ### JavaScript to IoTDB |
| |
| | JavaScript Type | IoTDB Type | Notes | |
| |-----------------|------------|-------| |
| | `boolean` | BOOLEAN | Direct mapping | |
| | `number` | INT32, FLOAT, DOUBLE | Depends on dataType specified | |
| | `bigint` | INT64, TIMESTAMP | Direct mapping | |
| | `string` | TEXT, STRING | UTF-8 encoded | |
| | `Buffer` | BLOB | Binary data | |
| | `Date` | DATE, TIMESTAMP | Converted to days or milliseconds | |
| |
| ### IoTDB to JavaScript |
| |
| | IoTDB Type | JavaScript Type | Notes | |
| |------------|-----------------|-------| |
| | BOOLEAN | `boolean` | true/false | |
| | INT32 | `number` | 32-bit integer | |
| | INT64 | `bigint` | 64-bit integer (may lose precision if converted to number) | |
| | FLOAT | `number` | Single precision | |
| | DOUBLE | `number` | Double precision | |
| | TEXT | `string` | UTF-8 decoded | |
| | BLOB | `Buffer` | Raw binary data | |
| | STRING | `string` | UTF-8 decoded | |
| | DATE | `Date` | Days since epoch converted to Date | |
| | TIMESTAMP | `Date` | Milliseconds since epoch | |
| |
| ## Null Values |
| |
| All data types support null values. Null values are represented using a bitmap in the binary protocol: |
| |
| ```typescript |
| // Query results may contain null values |
| const result = await session.executeQueryStatement('SELECT * FROM root.test.device1'); |
| |
| for (const row of result.rows) { |
| if (row[1] === null) { |
| console.log('Value is null'); |
| } |
| } |
| ``` |
| |
| ## Best Practices |
| |
| 1. **Use appropriate data types**: Choose the smallest type that fits your data to optimize storage |
| 2. **INT64 for large integers**: Use `bigint` in JavaScript for values that exceed Number.MAX_SAFE_INTEGER |
| 3. **FLOAT vs DOUBLE**: Use FLOAT (4 bytes) for sensor data where precision is less critical |
| 4. **TEXT vs STRING**: Both are UTF-8 strings; use based on IoTDB version compatibility |
| 5. **DATE for dates only**: Use DATE type when you only need date precision (not time of day) |
| 6. **TIMESTAMP for full datetime**: Use TIMESTAMP when you need millisecond precision |
| |
| ## Encoding Options |
| |
| Different data types support different encoding methods for compression: |
| |
| - **BOOLEAN**: PLAIN, RLE |
| - **INT32/INT64**: PLAIN, RLE, TS_2DIFF, GORILLA |
| - **FLOAT/DOUBLE**: PLAIN, RLE, TS_2DIFF, GORILLA |
| - **TEXT/STRING**: PLAIN |
| - **BLOB**: PLAIN |
| |
| Example: |
| ```typescript |
| await session.executeNonQueryStatement( |
| 'CREATE TIMESERIES root.test.device1.sensor WITH DATATYPE=INT32, ENCODING=RLE' |
| ); |
| ``` |
| |
| ## Testing |
| |
| A comprehensive test suite covering all data types is available in `tests/e2e/AllDataTypes.test.ts`. This test: |
| |
| - Creates timeseries with all data types |
| - Inserts data with proper type conversions |
| - Queries and validates returned data types |
| - Tests null value handling |
| - Verifies aggregation queries work with different types |
| |
| Run the test with: |
| ```bash |
| npm run test:e2e -- --testPathPattern=AllDataTypes |
| ``` |
| |
| ## Compatibility |
| |
| This client supports IoTDB versions that include these data types. For older IoTDB versions: |
| - Types 0-5 (BOOLEAN through TEXT) are universally supported |
| - Types 6-9 (BLOB, STRING, DATE, TIMESTAMP) require newer IoTDB versions (check your IoTDB version) |
| |
| If you use unsupported types, you'll receive an error from the IoTDB server during timeseries creation. |