美文网首页
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值

    写下这个标题,我的内心是复杂的。我们服务器的mysql接受了非法的enum值,但写入时将值truncate掉了,也...

  • [cpp deep dive] enum枚举类型

    如何声明一个枚举类型? 如何合法使用枚举类型? 不合法的例子? enum的值 ? enum的sizeof? 上代码...

  • Swift Tips_Primer-3:枚举,结构体和类

    enum 是值类型, 基本语法 enum的使用 原始值(Raw Value)和关联值(Associate Valu...

  • Swift中Enum的使用姿势

    Swift的Enum类型可以存储值 enum iOSDeviceSystemType {case iPhone(S...

  • swift3语法(八)

    枚举/结构体 枚举 定义形式enum 枚举名 { 枚举值} // 例如enum CompassPoint {...

  • Swift中rawValue的作用

    rawValue 用于swift中的enum(枚举),用于取枚举项的原始值,例如: enum Category: ...

  • 提高C++接口的易用性

    使用enum代替bool值 使用enum代替有限的int值,例如月份 使用类代替int,例如月、年 提供类似工厂类...

  • MySql生僻知识点

    Enum数据类型,enum('a','b','abc') Enum类型允许输入指定集合中的一个值,输入内容不区分大...

  • Swift Day03 枚举 可选项

    一、枚举 1. 枚举(enum)的基本写法? 2. 枚举(enum)的关联值(Associated Value)?...

  • go 枚举类型

    这里需要用到enum库 定义一个枚举类型 操作枚举enum 查看枚举值 修改自定义枚举值 添加和移除枚举值

网友评论

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

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