网站首页mysql

一个mysql的sql_mode严格模式引出的bug处理.

发布时间:2016-11-25 09:37:13编辑:slayer.hover阅读(931)

    把本地的代码调试好上传服务器后,执行的添加删除操作都给出了报错。

    查看日志发现了下面这行:

    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 |
    +--------------------------------------------+

    看来确实是这个问题了 :)


    解决它:

    1. 找到my.cnf文件,一般会在/usr/local/mysql/my.cnf这个位置。

    2. 编辑my.cnf, vim /usr/local/mysql/my.cnf

    3. 找到sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES修改为:sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIO

    4. 重启mysql, service mysql restart.

    重进mysql查询一下:

    mysql> select @@GLOBAL.sql_mode;
    +--------------------------------------------+
    | @@GLOBAL.sql_mode                          |
    +--------------------------------------------+
    | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +--------------------------------------------+


    完成,测试了一下,确实没有问题了。


    总结,虽然这样可以把问题解决掉,但在coding的时候最好还是按照严格模式来写,提高代码质量才是关键。

评论