我正在修复一个专有软件中的一个错误,其中我有某种 JDBC 连接(池化与否,包装与否,......)。我需要检测它是否是 MySQL 连接。我只能使用一个 SQL 查询。
每次在 MySQL 上都成功(MySQL 5 及更高版本就足够了)而在其他所有数据库上都失败(语法错误)的 SQL 查询是什么?
如果您有权访问 JDBC 连接,则可以相当轻松地检索数据库服务器的供应商,而无需通过 SQL 查询。
只需检查连接元数据:
string dbType = connection.getMetaData().getDatabaseProductName();
如果数据库实际上是 MySQL,这将为您提供一个带有“MySQL”的字符串(该字符串在社区版和企业版之间可能有所不同)。
如果您的错误是由于缺少对一种特定类型的语句的支持而导致MySQL 不支持,那么您实际上应该依靠适当的元数据方法来验证对该特定功能的支持,而不是硬编码解决方法专门用于 MySQL。还有其他类似 MySQL 的数据库(例如 MariaDB)。
如果您确实必须通过 SQL 查询,您可以使用此查询检索相同的字符串:
SELECT @@version_comment as 'DatabaseProductName';
但是,首选方法是通过读取 JDBC 为您提供的 DatabaseMetaData 对象。
假设您有有趣的先决条件(其他答案试图解决):
做这样的事情:
SELECT SQL_NO_CACHE 1;
这在 MySQL 中为您提供了一个值,而在其他平台上则失败,因为SQL_NO_CACHE
它是 MySQL 指令,而不是列。
或者,如果您的连接具有适当的权限:
SELECT * FROM mysql.db;
这是特定于 MySQL 的数据库中的信息表,因此在其他平台上会失败。
其他方法更好,但如果你真的像你在问题中所说的那样受到限制,这就是这样做的方法。
MySql 可能是唯一使用反引号的数据库引擎。这意味着这样的事情应该可以工作。
SELECT count(*)
FROM `INFORMATION_SCHEMA.CHARACTER_SETS`
where 1=3
我可能没有在正确的位置反引号。也许他们是这样的:
FROM `INFORMATION_SCHEMA`.`CHARACTER_SETS`
使用 MySql 的人会知道。