如何检查.sql文件中的SQL语法?
TLDR:
>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"
奇怪的是,mysql没有内置的开关,但您可以通过在查询前添加EXPLAIN
语句来检查语法。
如果你有一行statements.sql
文件,每行都有一个语句,请在所有行前面添加EXPLAIN
:
>awk '{print "EXPLAIN " $0}' statements.sql > check.sql
然后,您可以使用mysql
命令行工具运行语句,并使用--force
使其继续出错。它将为语法不正确的任何语句打印错误。
>mysql --force -u user -p database < check.sql
或者只查看有错误的行:
>mysql --force -u user -p database < check.sql | grep "ERROR"
您可以在一行中完成所有这些操作,而无需创建中间文件:
>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"
有一些免费/试用软件产品允许您连接到MySQL数据库或只是粘贴脚本来验证它。谷歌是你的朋友。 Mimer will check ANSI-Standard syntax validation但可能无法处理任何MySQL细节。
MySQL 8.0中的SELECT STATEMENT_DIGEST_TEXT
可用于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 vs NO ERROR进行检查,以了解传递的SQL语法是否有效(不包括非常有限的一组仅客户端命令,但大多数人都不会对这些命令感兴趣)。
摘要; SELECT STATEMENT_DIGEST_TEXT
是一个全面的SQL解析器(虽然它可能不是它的直接/预期函数),它可以在所有情况下用于快速检查语句的有效性而无需实际执行它们。就SQL有效性验证而言,这是一个巨大的进步。
请注意,您需要启动并运行MySQL服务器。您可以使用mysql -e
客户端或管道传递查询到mysql
等。
跑吧......
开始交易
运行
回滚
有几种可能性。如果您使用支持事务的InnoDB表,则只需在.sql文件的开头执行start transaction;
,最后执行rollback;
。 MySQL将输出任何语法错误。
如果您正在测试qazxsw poi或qazxsw poi语句,您可以在最后添加UPDATE
以防止这些查询进行任何数据库更改,并且仍然让MySQL检查语法。