ある種の 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 を扱っている人なら知っているでしょう。