MySQL 5.7+配置JDBC允许有损插入时sql_mode报错原因咨询
问题原因分析
这个报错的核心原因很直接:NO_STRICT_TRANS_TABLES 并不是MySQL支持的合法sql_mode值。
MySQL的sql_mode参数是用来指定启用的SQL模式集合,不存在以NO_前缀来否定STRICT_TRANS_TABLES的写法——你不能通过设置NO_STRICT_TRANS_TABLES来关闭严格模式,这个值本身就不在MySQL的合法模式列表里,所以数据库会返回语法错误,告诉你无法将sql_mode设置为这个无效值。
你想要的效果应该是关闭STRICT_TRANS_TABLES这个严格模式(它会在插入/更新数据时对截断等操作抛出错误),但用错了实现方式。结合你同时设置jdbcCompliantTruncation=false的需求(让JDBC驱动允许数据截断而不抛出异常),正确的做法是从sql_mode中移除STRICT_TRANS_TABLES,而不是使用一个不存在的模式值。
解决方案
你需要修改JDBC URL中的sessionVariables参数,将sql_mode设置为不包含STRICT_TRANS_TABLES的合法值。比如:
- 如果想快速关闭严格模式(不推荐长期使用,可能引入其他数据一致性问题),可以直接设置为空:
jdbc:mysql://localhost/mydb?useSSL=false&jdbcCompliantTruncation=false&sessionVariables=sql_mode=''
- 更稳妥的方式是保留MySQL 5.7默认的其他模式,只移除
STRICT_TRANS_TABLES。MySQL 5.7默认的sql_mode是ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,去掉STRICT_TRANS_TABLES后可以写成:
jdbc:mysql://localhost/mydb?useSSL=false&jdbcCompliantTruncation=false&sessionVariables=sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
另外补充:如果你的MySQL账号没有设置会话级sql_mode的权限,也可能触发类似错误,但从你给出的异常信息来看,核心还是模式值无效的问题。
内容的提问来源于stack exchange,提问作者Alex R
相关产品推荐
相关产品推荐

