tidb_multi_statement_mode参数

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】

  • 该变量用于控制是否在同一个 COM_QUERY 调用中执行多个查询。
    这个怎么理解呢?有没有大佬可以给个例子学习下

参考这个看看

tidb_multi_statement_mode是一个系统变量,用于控制TiDB在执行SQL语句时是否允许多个查询语句同时执行。在某些情况下,例如在进行事务操作或执行复杂查询时,启用多语句模式可以提高处理效率。但是,它也可能增加并发查询之间的冲突和错误的可能性。

在TiDB的早期版本中,由于安全和稳定性的考虑,默认值通常是关闭的(OFF)。如果在升级早期版本的TiDB后出现"client has multi-statement capability disabled"的错误,这可能就是由于未启用多语句模式。如果业务需要多语句支持,建议使用客户端提供的设置,不要使用tidb_multi_statement_mode变量进行设置。

需要注意的是,从TiDB 6.1.0版本开始引入了一个新的变量tidb_enable_new_only_full_group_by_check,其作用域为SESSION和GLOBAL,默认值是OFF,可选值有OFF和ON。该变量用于控制TiDB执行ONLY_FULL_GROUP_BY检查时的行为,如果对于查询语句中的GROUP BY字段不允许进行任何聚合函数的运算,会出现报错。这是由于可能的版本升级造成的兼容性问题,在v6.1中该变量默认值是OFF,即默认关闭。如果查询中聚合操作执行很慢时,可以尝试设置该变量为ON。

防止sql注入
比如,一个com_query接口,要是,不限制的话,就会是这样:
update XXX;select XXX;insert into;等等 跑多个查询

要是限制的话,上面的多查询,就报错了。

比如程序里面一次性执行"insert into A xxx;update B set xxx;"
默认情况下是会报错的

应用层写代码的时候还真没注意到这种情况,都是放到一起推给数据库执行的,看来是数据库自己处理了。

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。