行爲取決於MySQL會話變量sql_mode
。您可以在連接期間更改變量,並稍後將其重置爲原始值。在我的系統中,sql_mode
默認值爲:
SELECT @@sql_mode;
-- REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI,NO_AUTO_VALUE_ON_ZERO,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH
你可以在你的程序解析這個結果,刪除該項STRICT_ALL_TABLES
,更新SET SESSION sql_mode='...'
值,執行語句並在該年底重置變量交易。
編輯由@ ripper234:
這是我在這個答案的精神寫的代碼:
private static final disableMysqlStrictMode =
((String)Play.configuration.get("db.url")).contains("mysql://");
...
String originalSqlMode = null;
try {
if (disableMysqlStrictMode) {
// Strip away mysql's "strict mode" for this transaction - in case one of the columns is truncated, we don't want the entire tx to fail
// http://stackoverflow.com/a/10606085/11236
Query query = JPA.em().createNativeQuery("SELECT @@sql_mode;");
originalSqlMode = (String)query.getSingleResult();
String newSqlMode = originalSqlMode
.replace("STRICT_ALL_TABLES", "")
.replace("STRICT_TRANS_TABLES", "")
.replace(",,", ",");
JPA.em().createNativeQuery("SET SESSION sql_mode=?").setParameter(1, newSqlMode).executeUpdate();
}
// Save my entity here
obj.save();
} finally {
if (originalSqlMode != null) {
// Restore original sql_mode
JPA.em().createNativeQuery("SET SESSION sql_mode=?").setParameter(1, originalSqlMode).executeUpdate();
}
}
可以包裹在一個漂亮的形式,如果一個是這樣的傾向。
謝謝,我編輯了你的答案,包括我最終使用的代碼。 – ripper234