2

ある種の JDBC 接続 (プールされているかどうか、ラップされているかどうかなど) がある独自のソフトウェアのバグを修正しています。MySQL接続かどうかを検出する必要があります。使用できるのは SQL クエリだけです。

MySQL では毎回成功し (MySQL 5 以降で十分)、他のすべてのデータベースでは失敗 (構文エラー) する SQL クエリは何でしょうか?

4

3 に答える 3

4

JDBCメタデータを使用する推奨される方法...

JDBC 接続にアクセスできる場合は、SQL クエリを使用しなくても、データベース サーバーのベンダーを簡単に取得できます。

接続メタデータを確認するだけです。

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

これにより、データベースが実際に MySQL である場合、"MySQL" を含む文字列が得られます (文字列はコミュニティ エディションとエンタープライズ エディションで異なる場合があります)。

特定のタイプのステートメントがサポートされていないことがバグの原因で、 MySQL がサポートしていないことが原因である場合は、回避策をハードコーディングするのではなく、適切なメタデータ メソッドを使用して、その特定の機能のサポートを確認する必要があります。特にMySQL用。他にも MySQL に似たデータベースがあります (MariaDB など)。


本当に SQL クエリを通過する必要がある場合は、次のクエリを使用して同じ文字列を取得できます。

SELECT @@version_comment as 'DatabaseProductName';

ただし、推奨される方法は、JDBC が提供する DatabaseMetaData オブジェクトを読み取ることです。

于 2013-10-01T15:23:03.713 に答える
1

あなたの興味深い前提条件を仮定すると(他の答えは回避しようとします):

次のようにします。

SELECT SQL_NO_CACHE 1;

これにより、MySQL では単一の値が得られますがSQL_NO_CACHE、列ではなく MySQL 命令であるため、他のプラットフォームでは失敗します。

または、接続に適切な権限がある場合:

SELECT * FROM mysql.db;

これは MySQL 固有のデータベース内の情報テーブルであるため、他のプラットフォームでは失敗します。

他の方法の方が優れていますが、質問で言うように本当に制約がある場合は、これがその方法です。

于 2013-10-01T15:26:07.023 に答える
0

MySql は、バックティックを使用する唯一のデータベース エンジンである可能性があります。つまり、このようなものが機能するはずです。

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

バックティックが正しい場所にない可能性があります。多分彼らは次のようになります:

FROM `INFORMATION_SCHEMA`.`CHARACTER_SETS`

MySql を扱っている人なら知っているでしょう。

于 2013-10-01T15:27:13.687 に答える