如何检查.sql文件中的SQL语法?
答案 0 :(得分:5)
基本词法分析器似乎是在sql / sql_lex.cc中实现的。您可以使用/ salvage来构建自己的测试解析器。 但这只会检查语法,但不会检查任何运行时错误。
编辑:对于MySQL 8.0+,请参阅How can I check the SQL syntax in a .sql file?
答案 1 :(得分:3)
<强> 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"
答案 2 :(得分:2)
有一些免费/试用软件产品允许您连接到MySQL数据库或只是粘贴脚本来验证它。谷歌是你的朋友。 Mimer will check ANSI-Standard syntax validation但可能无法处理任何MySQL细节。
答案 3 :(得分:2)
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".
你看到了什么特别的东西吗?这是事实,'帮助&#39;是一个有效但仅限客户端的关键字 - 而不是服务器关键字。在任何情况下,无效的SQL语句都会产生类似的情况;一个错误。
因此,您可以根据ERROR vs NO ERROR进行检查,以了解传递的SQL语法是否有效(不包括非常有限的仅客户端命令集,但大多数人都不会对它们感兴趣)
概要; SELECT STATEMENT_DIGEST_TEXT
是一个全面的SQL解析器(虽然它可能不是它的直接/预期函数),它可以在所有情况下用于快速检查语句的有效性而无需实际执行它们。就SQL有效性验证而言,这是一个巨大的进步。
请注意,您需要启动并运行MySQL服务器。您可以使用mysql -e
客户端或管道传递查询mysql
等。
答案 4 :(得分:1)
跑吧......
开始交易
运行
回滚
答案 5 :(得分:1)
有几种可能性。如果您使用支持事务的InnoDB表,则只需在.sql文件的开头执行start transaction;
,在结尾处执行rollback;
。 MySQL将输出任何语法错误。
如果您正在测试UPDATE
或DELETE
语句,可以在末尾添加LIMIT 0
以防止这些查询进行任何数据库更改,并且仍然让MySQL检查语法。 / p>
答案 6 :(得分:1)
您可以将其粘贴到MySQL查询浏览器(GUI工具包的一部分)之类的查询浏览器中,并直观地检查关键字和字符串文字的颜色,以便更轻松地查看是否出现任何语法错误。