Java MySQL自动截断不适用于c3p0

Java MySQL自动截断不适用于c3p0,java,mysql,c3p0,Java,Mysql,C3p0,我有一张桌子 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) 数据被插入到表中。但是如果我使用c3p0的ComboP

我有一张桌子

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)
数据被插入到表中。但是如果我使用c3p0的
ComboPoolDataSource
,我会得到异常
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();

因此,如果您控制数据库,可能最简单的解决方案是使用mysqld上的--sql模式开关以您想要的模式执行MySQL。看

如果这不是一个选项,您可以在c3p0 ConnectionCustomizer中使用模式更改代码。看起来“会话”被定义为连接的生存期,所以您应该能够重写AbstractConnectionCustomizer的onAcquire方法。当从数据库获取连接时,该选项将只设置一次。看


祝你好运

这是我的一点想法,直到你得到一个正确的答案。。。即使在MySQL中,您也会收到警告。我认为捕获
MysqlDataTruncation
相当于忽略警告。