Invalid data format 看语义是数据类型不符,通常这个报错出现在使用行协议写入时。
如果是批量数据写入,想定位是哪条语句的问题,需要查看客户端日志。
如何确定使用的是哪个日志
bash
lsof -p `pidof taosadapter` | grep taoslog
如果没有安装lsof
bash
ls -l /proc/`pidof taosadapter`/fd |grep taoslog
在日志中直接查抄报错
bash
grep 'Invalid data format' -A2 -B2 taoslog0.0
通常会有如下3行报错信息:
bash
UTL ERROR SML:0x9dfd point type and db type mismatch. db type: 5, point type: 8, key:
UTL ERROR SML:0x9dfd smlModifyDBSchemas end failed:-2147471358:Invalid data format,
UTL ERROR SML:0x9dfd smlModifyDBSchemas error : Invalid data format
定位错误
第一条报错显示了报错的具体原因:
bash
db type: 5 ## 数据库中原数据类型
point type: 8 ## 写入数据的类型
key : ##写入的语句
想查看数据类型编码,只能去源代码查找:
c
// Data type definition
#define TSDB_DATA_TYPE_NULL 0 // 1 bytes
#define TSDB_DATA_TYPE_BOOL 1 // 1 bytes
#define TSDB_DATA_TYPE_TINYINT 2 // 1 byte
#define TSDB_DATA_TYPE_SMALLINT 3 // 2 bytes
#define TSDB_DATA_TYPE_INT 4 // 4 bytes
#define TSDB_DATA_TYPE_BIGINT 5 // 8 bytes
#define TSDB_DATA_TYPE_FLOAT 6 // 4 bytes
#define TSDB_DATA_TYPE_DOUBLE 7 // 8 bytes
#define TSDB_DATA_TYPE_VARCHAR 8 // string, alias for varchar
#define TSDB_DATA_TYPE_TIMESTAMP 9 // 8 bytes
#define TSDB_DATA_TYPE_NCHAR 10 // unicode string
#define TSDB_DATA_TYPE_UTINYINT 11 // 1 byte
#define TSDB_DATA_TYPE_USMALLINT 12 // 2 bytes
#define TSDB_DATA_TYPE_UINT 13 // 4 bytes
#define TSDB_DATA_TYPE_UBIGINT 14 // 8 bytes
#define TSDB_DATA_TYPE_JSON 15 // json string
#define TSDB_DATA_TYPE_VARBINARY 16 // binary
#define TSDB_DATA_TYPE_DECIMAL 17 // decimal
#define TSDB_DATA_TYPE_BLOB 18 // binary
#define TSDB_DATA_TYPE_MEDIUMBLOB 19
#define TSDB_DATA_TYPE_BINARY TSDB_DATA_TYPE_VARCHAR // string
#define TSDB_DATA_TYPE_GEOMETRY 20 // geometry
#define TSDB_DATA_TYPE_MAX 21
到这里,基本上就确定问题原因了。