我怎样检查.sql文件中的SQL语法?
我怎样检查.sql文件中的SQL语法?
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与NO ERROR来检查传递的SQL语法是否有效(排除非常有限的一些仅限于客户端的命令,但这些对大多数人来说并不感兴趣)。
总之,SELECT STATEMENT_DIGEST_TEXT
是一个全面的SQL解析器(虽然可能不是它的直接/预期功能),可用于所有情况下快速检查语句的有效性,而无需实际执行它们。这在SQL有效性验证方面是巨大的进步。
请注意,您需要运行一个MySQL服务器才能进行此操作。您可以使用mysql -e
客户端传递查询,或使用管道到mysql
等。
基本词法分析器似乎是在sql/sql_lex.cc中实现的。您可以使用/拯救它来构建自己的测试解析器。但这只会检查语法而不会检查任何运行时错误。
编辑:对于MySQL 8.0+,请参见如何检查.sql文件中的SQL语法?
>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"
awk '{if (sub(/;$/,";\n")) printf "EXPLAIN %s", $0; else print $0}' statements.sql
结合以分号结尾的行。 - Jon49有一些免费/试用软件可以让您连接到MySQL数据库或只需粘贴脚本以进行验证。在这里,Google是您的朋友。 Mimer将检查ANSI标准语法验证,但可能无法处理任何MySQL特定内容。
有几种可能性。如果您正在使用支持事务的InnoDB表,您可以在.sql文件开头简单地执行start transaction;
,并在结尾处执行rollback;
。MySQL将输出任何语法错误。
如果您正在测试UPDATE
或DELETE
语句,可以在末尾添加LIMIT 0
以防止这些查询进行任何数据库更改,同时仍然让MySQL检查语法。
只需运行它....
开始事务
运行它
回滚