美文网首页
mysql如何对待非法的enum值

mysql如何对待非法的enum值

作者: solohunter | 来源:发表于2017-09-24 10:32 被阅读71次

    写下这个标题,我的内心是复杂的。我们服务器的mysql接受了非法的enum值,但写入时将值truncate掉了,也就是写入了一个空的字符串,这个空的字符串会导致后续的代码运行异常,导致整个数据库事务回滚。数据库里没有任何记录,只能通过打更多log一步一步地定位问题。最终定位出问题,已经是N个小时后了。

    为什么mysql接受了非法的enum值?在我们的固有印象中,mysql遇到非法的enum值应该写入失败并报错。问题出在mysql的运行参数sql_mode。

    mysql> show create table customer\G
    *************************** 1. row ***************************
           Table: customer
    Create Table: CREATE TABLE `customer` (
      `id` int(11) NOT NULL DEFAULT '0',
      `gender` enum('m','f') DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    1 row in set (0.00 sec)
    
    mysql> select @@session.sql_mode;
    +------------------------+
    | @@session.sql_mode     |
    +------------------------+
    | NO_ENGINE_SUBSTITUTION |
    +------------------------+
    1 row in set (0.00 sec)
    

    此时sql_mode=NO_ENGINE_SUBSTITUTION ,尝试写入非法的enum值

    mysql> insert into customer values (2,'x');
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    mysql> select * from customer where id=2\G
    *************************** 1. row ***************************
        id: 2
    gender: 
    1 row in set (0.00 sec)
    

    可以看到写入成功了,但mysql报了一个warning且写入的gender值是空的!!

    修改sql_mode值,设置为严格模式

    mysql> set sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
    Query OK, 0 rows affected (0.00 sec)
    mysql> 
    mysql> select @@session.sql_mode;
    +--------------------------------------------+
    | @@session.sql_mode                         |
    +--------------------------------------------+
    | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
    +--------------------------------------------+
    1 row in set (0.00 sec)
    

    再次尝试写入,可以看出写入失败了。

    mysql> insert into customer values (4,'x');
    ERROR 1265 (01000): Data truncated for column 'gender' at row 1
    

    关于sql_mode可取的值以及不同值的含义,还请询问google或官方文档。

    相关文章

      网友评论

          本文标题:mysql如何对待非法的enum值

          本文链接:https://www.haomeiwen.com/subject/djckextx.html