用Data Services进行ETL时数据写入tidb时报syntax error

为提高效率,提问时请尽量提供详细背景信息,问题描述清晰可优先响应。以下信息点请尽量提供:

  • 系统版本 & kernel 版本
  • TiDB 版本】v3.0.4
  • 磁盘型号
  • 集群节点分布
  • 数据量 & region 数量 & 副本数
  • 问题描述(我做了什么)】使用SAP Data Servies写入tidb, job报错.tidb日志信息如图
  • 关键词】syntax error

这是语法错误,建议排查一下客户端写入的SQL语句是否符合TiDB语法规范

感谢您的及时回复.

是这样的, 同样的DS job, 数据写入到MySQL5.6, MySQL8.0 同样的表.是没问题的. SQL语句很简单, 就是 INSERT INTO “test”.“MATCHTABLE_S” (“ID”, “MATCHID”) VALUES (NULL, ‘xx-xxxxxxx-xxx-xxx-xxxx-xxxxxxxx-xxxxxxxx’);

另外, 在通过sqlyog客户端连接tidb, 执行该语句的时候报了一个这样的错误, error1 但是数据扔可以写入

p3

tidb.log上:

INSERT INTO “test”.“MATCHTABLE_S”(“ID”,“MATCHID”) values 修改为INSERT INTO test.MATCHTABLE_S(ID,MATCHID)这样可以吗,字段名称不应该用双引号

image 一样会报.

关于引号是这样的, 这个是SAP DS这套ETL工具连库的时候会用ANSI的sql_mode, 其中会设置 ANSI_QUOTES 之前用MySQL都是没问题的.

目前TiDB 不支持EXPLAIN INSERT语法

哦. 是的. 我把SQLyog里的explain result这个功能选项去掉之后就没有报这个错误了.谢谢.

还是回到DS 数据写入tidb, 报syntax error的这个问题上. 您之前说是排查客户端写入的SQL语句. log中错误信息的头一句是: [ERROR] [misc.go:114] [“syntax error”] [error="line 1 column 18 near "“test”.“MATCHTABLE_S” (“ID”, “MATCHID”) VALUES (?, ?) " "] 难道是 VALUES (?, ?) 这个出的问题?

可能是的,你能用生成的具体的语句在TiDB中执行一下看看

入库的语句就是, INSERT INTO “test”.“MATCHTABLE_S” (“ID”, “MATCHID”) VALUES (NULL, ‘xx-xxxxxxx-xxx-xxx-xxxx-xxxxxxxx-xxxxxxxx’). 这个语句是在跑MySQL表时在prosslist中看到的.

同样的job, 换成MySQL的表就不会错. 是tidb在解析 ? 占位符的时候出问题了?

建议检查一下sql_mode值,看是否设置了ANSI_QUOTES

tidb是支持sql_mode=ANSI的, 不是吗?

Data Services 在ETL的时候往表里写数据会使用VALUES (?, ?)这样用问号占位符的. 同样的处理, 使用MySQL是正常的.

嗯,tidb支持ANSI_QUOTES的sql_mode,但是默认的sql_mode值为:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION