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 ;
Run Code Online (Sandbox Code Playgroud)
如果 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".
Run Code Online (Sandbox Code Playgroud)
你看到有什么特别之处了吗?事实上,'HELP' 是一个有效的,但仅限客户端的关键字 - 而不是服务器关键字。无论如何,无效的 SQL 语句都会产生类似的情况;一个错误。
因此,您可以根据 ERROR 与 NO ERROR 进行检查,以了解传递的 SQL 语法是否有效(不包括非常有限的仅客户端命令集,但大多数人不会对这些命令感兴趣)。
概括; SELECT STATEMENT_DIGEST_TEXT
是一个全面的 SQL 解析器(虽然这可能不是它的直接/预期功能),它可以在所有情况下用于快速检查语句的有效性,而无需实际执行它们。就 SQL 有效性验证而言,这是一个巨大的进步。
请注意,您需要为此启动并运行 MySQL 服务器。您可以使用mysql -e
客户端或管道mysql
等传递查询。
基本词法分析器似乎是在sql/sql_lex.cc中实现的.您可以使用/ salvage来构建自己的测试解析器.但这只会检查语法,但不会检查任何运行时错误.
编辑:对于MySQL 8.0+,请参阅如何检查.sql文件中的SQL语法?
您可以将其粘贴到查询浏览器中,例如 MySQL 查询浏览器(GUI 工具包的一部分),并直观地检查关键字和字符串文字的颜色,以便更轻松地查看是否犯了任何语法错误。
http://dev.mysql.com/downloads/gui-tools/5.0.html
归档时间: |
|
查看次数: |
29702 次 |
最近记录: |