偶发报错parse SQL failed

【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.5.4
【复现路径】无
【遇到的问题:问题现象及影响】
在应用程序执行过程中,出现报错:

2024-08-30 18:42:57 (UTC+08:00)TiDB 10.11.209.124:3990[session.go:1754] [“parse SQL failed”] [conn=7790917293072170143] [error="[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 47 near "@MySqlConnectorSleep;" "] [SQL=“SELECT SLEEP(0) INTO @MySqlConnectorSleep;”]

检查应用程序中没有执行类似的sql,百度发现可能是MySQL驱动执行的,这个有做兼容支持么?

大佬你这个报错,看起来是tidb-Server的SQL解析器无法正确识别SQL类型,不兼容导致的错误

issue里说的其实很明白了,@MySqlConnectorSleep到底算不算一个标准的变量命名,这个库以这种方式来命名变量,也太 trigger 了。。

在 TiDB 7.5.3试了下,确实会报错

mysql> select 1 INTO @MySqlConnectorSleep;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 40 near "@MySqlConnectorSleep"
mysql>

是的呢,关键有没有兼容?这个应该是mysq给加的

不过看描述,也是支持utf8字符集的, https://docs.pingcap.com/zh/tidb/stable/user-defined-variables

:joy:字符集设置的utf8mb4

MySQL 兼容性
除 SELECT … INTO 外,MySQL 和 TiDB 支持的语法相同。
这个是已知的兼容性问题,建议用户使用 set 来设置变量取值来代替 select into variable。

tidb 不支持 select into @variable.
mysql> select 1 into @a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 16 near “@a

用 set 是可以的
mysql> set @MySqlConnectorSleep = sleep(0);
Query OK, 0 rows affected (0.00 sec)
mysql> select @MySqlConnectorSleep;
±---------------------------+
| @MySqlConnectorSleep |
±---------------------------+
| 0 |
±---------------------------+
1 row in set (0.00 sec)

2 个赞

:handshake: :handshake: :handshake:收到