博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
去IOE 遇到Jdbc mysql sql_mode的坑
阅读量:5960 次
发布时间:2019-06-19

本文共 1211 字,大约阅读时间需要 4 分钟。

在去IOE(IBM的小型机+Oracle的数据库+EMC的高端存储)的过程中遇到一个Oracle的建表语句(转换处理过后)具体语句如下:

b1a65d3b3a4e4bea101aac4d159d0a1b2a743129

通过Java的Jdbc执行后报错:BLOB/TEXT column 'FEXPRESSION' can't have a default value,42000,1101。也就是LONGTEXT类型的字段FEXPRESSION不能有默认值。

可是把这个建表语句拿到Mysql的客户端Navicat里去执行的时候居然创建成功了。这就奇怪了相同的建表语句通过Navicat执行的时候是成功的,但是通过Java Jdbc执行却不成功。

然后又把这个建表语句拿到Mysql服务器上去执行也是成功的,那也就是说是Jdbc的问题了。于是查找了下资料发现BLOB/TEXT column 'FEXPRESSION' can't have a default这个错误跟Mysql的sql_mode是有关系的,于是通过在Navicat执行show variables like 'sql_mode' 命令看了下Mysql的sql_mode是非严格模式的所以在Navicat执行这个建表语句是能够通过的。那么难道通过Jdbc执行失败是因为Jdbc会设置sql_mode为严格模式?怀着这样的疑问通过到Mysql服务器上进行tcpdump 把网络抓包(抓取Jdbc执行建表语句的包)后的数据保存到pcap文件,然后用wireshak分析查看通过Java的Jdbc执行建表语句发送到Mysql服务端的数据包里是否带有sql_mode。果然通过Jdbc执行的建表语句数据包里带有sql_mode并且是严格模式的。如图:

b7785ed2c06323e88f8b55a2067f8b9d55f0bc70

那么也就是Jdbc默认会把sql_mode设置为严格模式,所以导致了通过Jdbc执行建表语句失败。

然后查了下资料原来JDBC Driver默认会设置会话SQL_MODE='STRICT_TRANS_TABLES'的原因是:"enforce JDBC compliance on truncation checks"需要开启"STRICT_TRANS_TABLES"这个SQL_MODE,而在JDBC URL中存在着"jdbcCompliantTruncation"这个参数,该参数可以控制是否开启"enforce JDBC compliance on truncation checks"功能,当我们通过JDBC URL设定"jdbcCompliantTruncation=false"之后,也就不会去默认设置SQL_MODE='STRICT_TRANS_TABLES'了

ok 那么接下来问题就简单了,设置下链接参数就解决问题了,代码如下:

bbe9b51cf210aa805f0d781de33ea169a61995b4

如果上面的内容对您有所帮助,请点个赞。去IOE的道路任重而道远,有了我们这条路将变得宽阔开广,如果您对去IOE感兴趣,欢迎加入我们ADAM团队。

转载地址:http://odyax.baihongyu.com/

你可能感兴趣的文章
山西警方破获快递跨省运输贩毒案
查看>>
河北省政协十二届二次会议开幕
查看>>
沈阳国际冰雪季以“冰棋园”演绎冰雪“棋”迹
查看>>
为什么 Python 4.0 会与 Python 3.0 不同?
查看>>
Android无处不在,Android开发者大有可为
查看>>
Nodejs:使用Mongodb存储和提供后端CRD服务
查看>>
Dubbo配置直连
查看>>
一个小白的四次前端面试经历
查看>>
Hybrid App技术解析 -- 原理篇
查看>>
前端也要学系列:设计模式之策略模式
查看>>
【译】SQL 指引:如何写出更好的查询
查看>>
细说 Java 的深拷贝和浅拷
查看>>
go配置文件读取
查看>>
通过项目梳理vuex模块化 与vue组件管理
查看>>
每天阅读一个 npm 模块(2)- mem
查看>>
React Native 中的状态栏
查看>>
Python 抓取微信公众号账号信息
查看>>
Spring源码系列:依赖注入-引言
查看>>
在Node.js中使用C++模块
查看>>
Redis持久化RDB和AOF优缺点是什么?
查看>>