我有一张桌子。
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();
答案 0 :(得分:0)
所以,如果您控制数据库,可能最简单的解决方案是使用mysqld上的--sql-mode开关以您想要的模式执行MySQL。见http://dev.mysql.com/doc/refman/5.6/en/server-sql-mode.html
如果这不是一个选项,您可以在c3p0 ConnectionCustomizer中使用模式更改代码。看起来“session”被定义为Connection的生命周期,因此您应该能够覆盖AbstractConnectionCustomizer的onAcquire方法。从数据库中获取Connection时,该选项将只设置一次。见http://www.mchange.com/projects/c3p0/#connection_customizers
祝你好运!