0

私はテーブルを持っています。

mysql> SELECT @@GLOBAL.sql_mode;

... 空を返します。

mysql> create table testtable ( name varbinary(5));

mysql> insert into testtable values('hellowhowareyoudsafafas');

Query OK, 1 row affected, 1 warning (0.00 sec)

データがテーブルに挿入されます。しかし、c3p0ComboPoolDataSourceを使用すると、例外が発生しますcom.mysql.jdbc.MysqlDataTruncation

MySQL 5.1 で MySQL の厳密モードを設定していなかったので、データがテーブルに格納されることを期待していました。c3p0 による自動切り捨てを許可するにはどうすればよいですか。

=====わかりましたが、もっときちんとした方法はありますか======

PreparedStatement ps1 =  connection.prepareStatement("SELECT @@sql_mode");
    ResultSet rs = ps1.executeQuery();
    String originalSqlMode = "";
    if(rs.next()) {
        originalSqlMode = rs.getString(1);
        System.out.println(originalSqlMode);
    }
    String newSqlMode = originalSqlMode.replace("STRICT_ALL_TABLES", "").replace("STRICT_TRANS_TABLES", "").replace(",,", ",");
    ps1 = connection.prepareStatement("SET SESSION sql_mode=?");
    ps1.setString(1, newSqlMode);
    ps1.execute();
    PreparedStatement ps2 = connection.prepareStatement("insert into testtable values (?)");
    ps2.setString(1, "indianpeople");
    ps2.execute();
4

1 に答える 1

0

したがって、データベースを制御している場合、おそらく最も簡単な解決策は、mysqld の --sql-mode スイッチを使用して、必要なモードで MySQL を実行することです。http://dev.mysql.com/doc/refman/5.6/en/server-sql-mode.htmlを参照してください。

それができない場合は、c3p0 ConnectionCustomizer でモード変更コードを使用できます。「セッション」は接続の有効期間として定義されているように見えるので、AbstractConnectionCustomizer の onAcquire メソッドをオーバーライドするだけでよいはずです。このオプションは、接続がデータベースから取得されるときに 1 回だけ設定されます。http://www.mchange.com/projects/c3p0/#connection_customizersを参照してください。

幸運を!

于 2013-02-25T11:23:43.553 に答える