SELECT STATEMENT_DIGEST_TEXT
在MySQL 8.0中可以用于MySQL查询语法验证。
8.0.4>SELECT STATEMENT_DIGEST_TEXT('FLUSH TABLES')\G
STATEMENT_DIGEST_TEXT('FLUSH TABLES'): FLUSH TABLES
8.0.4>SELECT STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;")\G
STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;"): SET GLOBAL `second_cache` . `key_buffer_size` = ? * ? ;
8.0.4>SELECT STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;")\G
STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;"): CREATE TABLE `t1` ( `a2` INTEGER UNSIGNED NOT NULL , `b2` INTEGER UNSIGNED NOT NULL , `c2` INTEGER UNSIGNED NOT NULL , PRIMARY KEY ( `a2` ) , INDEX `b2x` ( `b2` ) , INDEX `c2x` ( `c2` ) ) ENGINE = MEMORY ;
如果不支持 SQL,您将收到错误消息。与下一个类似,但此响应有一些特别之处;
8.0.4>SELECT STATEMENT_DIGEST_TEXT('HELP SELECT')\G
ERROR 3676 (HY000): Could not parse argument to digest function: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT' at line 1".
你看到什么特别了吗?事实上,“HELP”是一个有效的但仅限客户端的关键字,即不是服务器关键字。无论如何,无效的SQL语句都会产生类似的情况;一个错误。
因此,您可以根据 ERROR 与 NO ERROR 进行检查,以了解传递的 SQL 语法是否有效(不包括非常有限的一组仅限客户端的命令,但大多数人不会对此感兴趣)。
概括;SELECT STATEMENT_DIGEST_TEXT
是一个全面的 SQL 解析器(虽然这可能不是它的直接/预期功能),可以在所有情况下使用它来快速检查语句的有效性,而无需实际执行它们。就 SQL 有效性验证而言,这是巨大的进步。
请注意,为此您需要启动并运行 MySQL 服务器。您可以使用以下方式传递查询mysql -e
客户端,或使用管道mysql
etc.