【问题标题】:Query to detect MySQL查询以检测 MySQL
【发布时间】:2013-10-07 20:03:34
【问题描述】:

我正在修复专有软件中的一个错误,其中我有某种 JDBC 连接(池化与否,封装与否,...)。我需要检测它是否是 MySQL 连接。我只能使用 SQL 查询。

什么是每次在 MySQL 上都成功(MySQL 5 及更高版本就足够了)而在所有其他数据库上都失败(语法错误)的 SQL 查询?

【问题讨论】:

  • 必须有更好的方法来解决这个问题。
  • 为什么要让查询无法检测到是否是MySQL?你不能使用SHOW VARIABLES LIKE "%version%"; 或检查version_comment 是否包含字符串MySQL

标签: mysql sql jdbc


【解决方案1】:

首选方式,使用 JDBC 元数据...

如果您可以访问 JDBC 连接,则可以相当轻松地检索数据库服务器的供应商,而无需通过 SQL 查询。

只需检查连接元数据:

string dbType = connection.getMetaData().getDatabaseProductName();

如果数据库实际上是 MySQL,这将给您一个带有“MySQL”的字符串(该字符串在社区版和企业版之间可能不同)。

如果您的错误是由于缺少对一种特定类型的语句的支持而导致 MySQL 不支持,那么您实际上应该依靠 the appropriate metadata method 来验证是否支持该特定功能而不是专门为 MySQL 硬编码解决方法。还有其他类似 MySQL 的数据库(例如 MariaDB)。


如果您确实必须通过 SQL 查询,您可以使用此查询检索相同的字符串:

SELECT @@version_comment as 'DatabaseProductName';

但是,首选方法是读取 JDBC 为您提供的 DatabaseMetaData 对象。

【讨论】:

    【解决方案2】:

    假设您感兴趣的先决条件(其他答案试图解决):

    做这样的事情:

    SELECT SQL_NO_CACHE 1;
    

    这会在 MySQL 中为您提供单个值,而在其他平台上会失败,因为 SQL_NO_CACHE 是 MySQL 指令,而不是列。

    或者,如果您的连接具有适当的权限:

    SELECT * FROM mysql.db;
    

    这是一个特定于 MySQL 的数据库中的信息表,因此在其他平台上会失败。

    其他方法更好,但如果你真的像你在问题中所说的那样受到限制,这就是这样做的方法。

    【讨论】:

      【解决方案3】:

      MySql 可能是唯一使用反引号的数据库引擎。这意味着这样的事情应该可以工作。

      SELECT count(*)
      FROM `INFORMATION_SCHEMA.CHARACTER_SETS`
      where 1=3
      

      我可能没有在正确的位置使用反引号。也许他们会这样:

      FROM `INFORMATION_SCHEMA`.`CHARACTER_SETS`
      

      使用 MySql 的人会知道。

      【讨论】:

      • 第二个版本是要走的路。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多