在去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并且是严格模式的。如图: