网站首页mysql
一个mysql的sql_mode严格模式引出的bug处理.
发布时间:2016-11-25 01:37:13编辑:slayer.hover阅读(3218)
把本地的代码调试好上传服务器后,执行的添加删除操作都给出了报错。
查看日志发现了下面这行:
Incorrect decimal value: '' for column 'amount' at row 1:INSERT INTO `records` (`id`, `amount`) VALUES ('73', '')
虽说这写法上是有点儿不严谨,但也不至于出错吧,而且本地也都能更新上去,怀疑是mysql版本的问题。
查了一下版本号5.6.23, 挺高的版本。
在另外一台5.6版本的mysql上测试了给int或者decimal类型的字段赋值空字符串,也能成功执行,那应该不是版本问题。
在网上查后发现,如果mysql使用了sql_mode为严格模式STRICT_TRANS_TABLES的话,可能会导致:
字段不支持自动类型转换,如给int、decimal类型的类型插入个空字符串,自动变成0
进mysql里查询一下:
mysql> select @@GLOBAL.sql_mode; +--------------------------------------------+ | @@GLOBAL.sql_mode | +--------------------------------------------+ | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+
看来确实是这个问题了 :)
解决它:
找到my.cnf文件,一般会在/usr/local/mysql/my.cnf这个位置。
编辑my.cnf, vim /usr/local/mysql/my.cnf
找到sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES修改为:sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIO
重启mysql, service mysql restart.
重进mysql查询一下:
mysql> select @@GLOBAL.sql_mode; +--------------------------------------------+ | @@GLOBAL.sql_mode | +--------------------------------------------+ | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+
完成,测试了一下,确实没有问题了。
总结,虽然这样可以把问题解决掉,但在coding的时候最好还是按照严格模式来写,提高代码质量才是关键。
评论