如何检查(My)SQL 语句的语法正确性

Posted

技术标签:

【中文标题】如何检查(My)SQL 语句的语法正确性【英文标题】:How can I check (My)SQL statements for syntactical correctness 【发布时间】:2010-10-19 16:43:44 【问题描述】:

我们目前正在设置集成服务器,在此过程中,我们在 SVN 上设置了预提交挂钩,以便我们的开发人员无法签入语法无效的文件(主要是 php 和 XML)。

我们还有一堆 .sql 文件(用于 mysql),我也想对其进行 lint。不幸的是,谷歌没有发现任何对这项任务有用的东西。

有什么想法吗?

【问题讨论】:

完全相同的问题——系统必须处理 DDL(实际上 SQL 文件都是 DDL),以及 MySQL 增强。 【参考方案1】:

在搜索了用于在 Mysql 中进行语法检查的 CLI 工具以在 Jenkins 中使用后并没有快速找到任何东西(这个 *** 问题是第一个结果之一 - 哈哈)我想出了以下解决方案(操作系统:Linux,但在 Windows 上也应该可行):

类似以下内容:

lint_result=`mysql mysql_test -B -f -e 'select asdf s where x;' 2>&1`; if [ `echo $lint_result | sed -r "s/ERROR ([0-9]*).*/\1/g"` -eq 1064 ]; then echo -e "Syntax error:\n$lint_result"; fi
Syntax error:
ERROR 1064 (42000) at line 1: 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 'where x' at line 1

(要检查 sql 文件,您可以使用 "

如果查询的语法不能被 mysql 解析,它声称: 第 1 行的 ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法

仅当语法正确时,它才会尝试执行查询并意识到该表不存在,但这不再有趣:

ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist

因此错误 1064 是无效的语法。您只需要创建一个空的测试数据库,否则只会出现带有错误 FROM 部分的错误(例如,需要数据库才能获得有效的语法检查结果:'select asdf from s where x and if;)。

据我测试,它工作正常(Mysql 5.5 版)。

这里有一个完整的 bash 脚本版本:

#!/bin/bash

source_dir=$1;
database="mysql_test";
mysql_args="-h127.0.0.1";

mysql $mysql_args -B -e "DROP DATABASE IF EXISTS $database; CREATE DATABASE $database;";
for file in `find $source_dir -name "*.sql"`; do
    lint_result=`mysql $mysql_args $database -f -b < $file 2>&1`;
    if [ "`echo $lint_result | sed -r \"s/ERROR ([0-9]*).*/\1/g\"`" = "1064" ]; then
        echo -e "Syntax error in file $file:\n$lint_result" && exit 1;
    fi;
done

【讨论】:

优秀的解决方案!!像魅力一样工作。【参考方案2】:

commercial 版本的 MySQL Workbench 有一个用于 MySQL 语句的语法检查器,但当然这只会涵盖数据库方面。请参阅http://mysql.com/products/workbench/(尽管我在免费应用程序的帮助索引中找到了事实)。

【讨论】:

谢谢!但不幸的是,我不认为我可以说服我的老板购买它只是为了我们的集成服务器有另一个整洁的玩具:)【参考方案3】:

这是一个validator,它根据 SQL 92/99/2003 标准进行验证,但是您提到 MySQL 的事实让我相信您在 SQL 查询中使用了 MySQL 特定的语法。

一种选择是在处理数据库层时采用不可知的方法,编写不可知的 SQL 代码。您显然需要与 Mimer 取得联系,看看您是否可以将其离线并将其集成到您的 CI 环境中。

整体方法中有几个“ifs”,这完全取决于您在当前状态下是否愿意/能够编写不可知的 SQL 代码。

【讨论】:

有趣的链接!不幸的是,编写不可知的 SQL 不是一种选择。 Out 系统的流量很大,我们需要从 MySQL 中榨取最后一点性能(至少在某些地方)。 链接也失效了【参考方案4】:

我编写了一个 CLI 工具来使用 phpMyAdmin SQL 解析器检查 SQL 文件的语法:php-sqllint。

【讨论】:

如何在windows上安装并使用php-sqllint? 我的防病毒软件说指向 php-sqllint 的链接是恶意的/带有垃圾邮件/广告:(【参考方案5】:

免责声明:我还没有尝试过任何这些工具! YMMV!

PHPMyAdmin's validating SQL parser 是一个积极开发的开源项目,在 2021 年将是我现在最好的选择。

我发现的另一个或多或少的当前项目看起来并不成熟,但它是:

Persist SQL Query“最好和最完整的 MySQL (PHP) 查询构建器/解析器”根据其 Github 标语,但它没有显式验证,但从源代码中你可以看到它确实抛出异常,如果查询可以'没有被正确解析。

顺便提一下:PHP-SQL-Parser 是非验证的,所以它不符合 linting 的条件。

【讨论】:

以上是关于如何检查(My)SQL 语句的语法正确性的主要内容,如果未能解决你的问题,请参考以下文章

如何在不运行实际查询的情况下检查 JDBC 语句的 SQL 语法?

错误1064-尽管在线语法检查器说代码是正确的,但您的SQL语法在行中有错误……尽管如此

检查SQL语句是否合法

我如何解决以下sql语法错误

C# 中的 Sql Parser 用于语法检查 Oracle 语句

说说如何做oracle的SQL审核呢