在去IOE(IBM的小型机+Oracle的数据库+EMC的高端存储)的过程中遇到一个Oracle的建表语句(转换处理过后)具体语句如下:
通过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并且是严格模式的。如图:
那么也就是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 那么接下来问题就简单了,设置下链接参数就解决问题了,代码如下:
如果上面的内容对您有所帮助,请点个赞。去IOE的道路任重而道远,有了我们这条路将变得宽阔开广,如果您对去IOE感兴趣,欢迎加入我们ADAM团队。