去IOE 遇到Jdbc mysql sql_mode的坑

  1. 云栖社区>
  2. 博客>
  3. 正文

去IOE 遇到Jdbc mysql sql_mode的坑

adam_public 2018-08-15 17:27:06 浏览951 评论0

摘要: 在去IOE(IBM的小型机+Oracle的数据库+EMC的高端存储)的过程中遇到一个Oracle的建表语句(转换处理过后)具体语句如下: 通过Java的Jdbc执行后报错:BLOB/TEXT column 'FEXPRESSION' can't have a default value,42000,1101。

在去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团队。

【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用免费申请,限量从速!  详情请点击

网友评论