私の質問の短いバージョンは次のとおりです。
PreparedStatement ps;
ps = connection.prepareStatement("Insert into T values (?)");
ps.setBoolean(1, true);
ps.executeUpdate();
このコード サンプルで値が引用符で囲まれたクエリが生成される理由は何ですか?
私の質問の長いバージョンは次のとおりです。
MySQLDataTruncation
DB インタラクション用にプレーンな JDBC を使用する JavaEE アプリケーションを使用していますが、最近、ログにいくつかの例外が表示されることに気付きました。これらの例外は、ブール列が として定義されている DB テーブルにエンティティを保存しようとしたときに発生していましたBIT(1)
。そして、生成されたクエリが次のようになったためです。
Insert into T values ('1');
値は引用符で囲まれていることに注意してください。クエリは、Log4Jlog.info(ps);
ステートメントを使用してアプリケーションからログに記録されました。以前のログは、引用符がない場所を示しています。
さらに、MySQL サーバーのログも異なって見えるようになりました。これが発生する前に、実行された各クエリに対してレコードのペアを指定していました。
12345 Prepare Insert into T values (?)
12345 Execute Insert into T values (1)
以降:
12345 Query Insert into T values ('1')
これらの変更は、新しいバージョンのアプリケーションをデプロイしたり、MySQL/アプリケーション サーバーを再起動したりした結果ではないことに注意してください。クエリ生成を担当するコードは、この質問の例と同じくらい簡単です。
アプリケーション サーバーを再起動すると、問題が約 12 時間修正された後、再び発生しました。一時的な解決策として、BIT
列を次のように変更しましたTINYINT
PS アプリケーションと MySQL の両方のログを調べると、問題が発生した時間帯を約 2 分に絞り込むことができましたが、この期間のログには異常はありませんでした。
PPS アプリケーション サーバーは Glassfish 2.1.1、MySQL サーバーのバージョンは 5.5.31-1~dotdeb、MySQL Connector/J のバージョンは 5.0.3 です。