如何检查.sql文件中的SQL语法?

max*_*kie 23 mysql validation syntax

如何检查.sql文件中的SQL语法?

Roe*_*aar 6

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等传递查询。


Vol*_*erK 5

基本词法分析器似乎是在sql/sql_lex.cc中实现的.您可以使用/ salvage来构建自己的测试解析器.但这只会检查语法,但不会检查任何运行时错误.

编辑:对于MySQL 8.0+,请参阅如何检查.sql文件中的SQL语法?


Har*_*guy 1

您可以将其粘贴到查询浏览器中,例如 MySQL 查询浏览器(GUI 工具包的一部分),并直观地检查关键字和字符串文字的颜色,以便更轻松地查看是否犯了任何语法错误。

http://dev.mysql.com/downloads/gui-tools/5.0.html