最近在调整MySQL存储过程以及通过事件调用的过程中遇到几个坑,记录如下。
MySQL版本:5.6
开发工具:SQLyog v12
1、存储过程 P 中有一条 UPDATE 临时表 TEMP_T 的语句,调整过程中把表名写错了,相当于 UPDATE TEMP_T 之前,并没有创建 TEMP_T。但是,存储过程 P 在最终提交的时候并没有报错,而且执行存储过程 P 也没有报错!然而,后来观察到通过事件 E 调用此存储过程失败了,失败原因就是表不存在!
2、存储过程 P 中创建了一张临时表 TEMP_T,其中一个字段 C 为 TEXT 类型,而且定义了 DEFAULT ''(实际上 TEXT 类型不支持自定义默认值)。同样的,存储过程 P 在提交和执行过程中都没有报错,而通过事件 E 调用时才出现了报错!
1101 - 42000 - BLOB/TEXT column 'adp_msg' can't have a default value
3、更有意思的是,我还创建了一张实体表 T,其中一个字段 C 为 TEXT 类型,而且定义了 DEFAULT ''。直接执行建表语句没有任何报错,但是通过 SQLyog 查看表信息时,发现字段 C 的 DEFAULT '' 定义已经被取消了!
结论:因为所有的执行操作都是在 SQLyog 上进行的,所以我怀疑这个软件是不是有忽略部分 SQL 错误的功能?接着,我改用 Navicat 测试了一下 TEXT 类型定义 DEFAULT '' 问题,仍然没有报错,是不是说明这两个客户端软件都会忽略错误,还是 MySQL 本身的问题?