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

Mysql 如何检查.SQL文件中的SQL语法?,mysql,validation,syntax,Mysql,Validation,Syntax,如何检查.SQL文件中的SQL语法?只需运行它 开始交易 运行它 回滚(rollback)有一些免费/试用的软件产品,可以让您连接到MySQL数据库,或者只是粘贴到脚本中进行验证。谷歌是你在这里的朋友。 但可能无法处理任何MySQL细节。有几种可能性。如果您使用的是支持事务的InnoDB表,则只需执行start事务在.sql文件的开头,并执行回滚在末尾。MySQL将输出任何语法错误 如果您正在测试UPDATE或DELETE语句,您可以在末尾添加LIMIT 0,以防止这些查询对数据库进行任何更改,

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

只需运行它

开始交易

运行它


回滚(rollback)

有一些免费/试用的软件产品,可以让您连接到MySQL数据库,或者只是粘贴到脚本中进行验证。谷歌是你在这里的朋友。
但可能无法处理任何MySQL细节。

有几种可能性。如果您使用的是支持事务的InnoDB表,则只需执行
start事务
在.sql文件的开头,并执行
回滚在末尾。MySQL将输出任何语法错误


如果您正在测试
UPDATE
DELETE
语句,您可以在末尾添加
LIMIT 0
,以防止这些查询对数据库进行任何更改,并且仍然让MySQL检查语法。

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


编辑:对于MySQL 8.0+请参见

,您可以将其粘贴到类似MySQL查询浏览器(GUI工具包的一部分)的查询浏览器中,并直观地检查关键字和字符串文字的颜色,以便更容易地查看是否有语法错误

TLDR:

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"

奇怪的是,mysql没有内置的开关,但是您可以通过在查询前添加
EXPLAIN
语句来检查语法

如果您有一个
statements.sql
文件,其中每条语句都在一行中,请在所有行前面加上以下内容:

>awk '{print "EXPLAIN " $0}' statements.sql > check.sql
然后,您可以使用
mysql
命令行工具运行这些语句,并使用
--force
使其在出错时继续。它将为语法不正确的任何语句打印错误

>mysql --force -u user -p database < check.sql

MySQL 8.0中的SELECT语句\u摘要\u文本
可用于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语法是否有效(不包括非常有限的仅客户端命令集,但大多数人不会感兴趣)

总结<代码>选择语句\u摘要\u文本是一个全面的SQL解析器(虽然这可能不是它的直接/预期功能),在所有情况下都可以使用它快速检查语句的有效性,而无需实际执行它们。就SQL有效性验证而言,这是一个巨大的进步


请注意,您需要安装一个MySQL服务器并为此运行。您可以使用
mysql-e
客户端传递查询,或者通过管道传递到
mysql
等等。

这需要大量的澄清才能有用(并且保持开放)。您是否在询问有关可视化检查SQL的提示?您是否正在寻找一个脚本来帮助您检查语法?您是否正在运行脚本,并且需要了解特定错误的帮助?我认为他们希望验证该文件是否具有有效的mySql语法。目视检查SQL文件或脚本也可以检查syntax@maxjackie说“目视检查SQL文件或脚本也可以检查语法”。根据我的经验,人类并不是100%准确地检查语法,但DB是!在一个接受一组迁移/回滚脚本的自动化系统中,知道它们至少通过了基本语法检查,如果没有足够的意义,则提交失败。运行它将给出答案,但是否有任何东西显示该文件中存在语法错误…如果表是MyISAM,则无法回滚,或者,如果脚本运行隐式提交语句(例如DDL),或者脚本包含提交语句。@Bill Karwin,他们的问题很简单,没有提到这些;-)在语句前面加上“EXPLAIN”将导致解析语句并报告解析器错误,而不会更改数据或占用数据库上的太多资源。请勿在生产环境中运行此操作!有些语句隐式地立即提交。有很多。Ref for a list脚本可能包含导致隐式提交的语句。没错,这会对.sql文件的内容做出一些假设。例如,这种编程解决方案对于验证mysqldump结果至少在语法上是完整的非常有用。是的,但这样做会很复杂。更简单的方法(具有相同的结果);我会添加这个,这样文件就不需要是一行<代码>awk“{if(sub(/;$/,“;\n”))printf“EXPLAIN%s”、$0;else print$0}”语句。sql组合以分号结尾的行。
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 ; 
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".