OwlFocus

Mysql sql-mode problem

数据库中开启非严格模式,插入数据时,不插入非空字段,在navicat中执行语句没有问题;在java中执行相同的语句却出现如下错误。

error

java.sql.SQLException:Field ‘status’ does not have a default value

数据库设置

  • status在数据库存中设置not null,并且没有默认值。
  • sql_mode=’’;

设置 sql_mode

查看当前连接会话的sql模式:
mysql> select @@session.sql_mode;
或者从环境变量里取
mysql> show variables like “sql_mode”;
查看全局sql_mode设置:
mysql> select @@global.sql_mode;
只设置global,需要重新连接进来才会生效

Set sessionVariables

尝试设置sessionVariables,修改sql-mode属性,结果还是相同的问题。

1
jdbc:mysql://localhost:3306/db?sessionVariables=sql_mode=

mysql-connector-java-.jar

经排查,驱动包会默认加上STRICT_TRANS_TABLES,导致java中无法开启非严格模式。
类:
com.mysql.jdbc.ConnectionImpl.java
以下是设置方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void setupServerForTruncationChecks() throws SQLException {
if (getJdbcCompliantTruncation()) {
if (versionMeetsMinimum(5, 0, 2)) {
String currentSqlMode = this.serverVariables.get("sql_mode");
boolean strictTransTablesIsSet = StringUtils.indexOfIgnoreCase(currentSqlMode, "STRICT_TRANS_TABLES") != -1;
if (currentSqlMode == null || currentSqlMode.length() == 0 || !strictTransTablesIsSet) {
StringBuilder commandBuf = new StringBuilder("SET sql_mode='");
if (currentSqlMode != null && currentSqlMode.length() > 0) {
commandBuf.append(currentSqlMode);
commandBuf.append(",");
}
commandBuf.append("STRICT_TRANS_TABLES'");
execSQL(null, commandBuf.toString(), -1, null, DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY, false, this.database, null, false);
setJdbcCompliantTruncation(false); // server's handling this for us now
} else if (strictTransTablesIsSet) {
// We didn't set it, but someone did, so we piggy back on it
setJdbcCompliantTruncation(false); // server's handling this for us now
}
}
}
}

解决

后面妥协了,给数据库字段加默认值。

其它

sql_mode=STRICT_TRANS_TABLES
设置它,表示启用严格模式。

MySQL sql_mode 说明

How to set MySQL ANSI_QUOTES mode via MySQL Java Connector?