mysql如何对待非法的enum值
2017-11-13 17:00
85 查看
写下这个标题,我的内心是复杂的。我们服务器的mysql接受了非法的enum值,但写入时将值truncate掉了,也就是写入了一个空的字符串,这个空的字符串会导致后续的代码运行异常,导致整个数据库事务回滚。数据库里没有任何记录,只能通过打更多log一步一步地定位问题。最终定位出问题,已经是N个小时后了。
为什么mysql接受了非法的enum值?在我们的固有印象中,mysql遇到非法的enum值应该写入失败并报错。问题出在mysql的运行参数sql_mode。
此时sql_mode=NO_ENGINE_SUBSTITUTION ,尝试写入非法的enum值
可以看到写入成功了,但mysql报了一个warning且写入的gender值是空的!!
修改sql_mode值,设置为严格模式
再次尝试写入,可以看出写入失败了。
关于sql_mode可取的值以及不同值的含义,还请询问google或官方文档。
为什么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的binlog数据如何查看
- MySQL 如何为一个非常大的数据库设置一个备库?
- PHP如何批量更新MYSQL中的数据
- MySQL 如何优化 ORDER BY
- Linux下如何开启MySQL的log_bin日志
- Host 'XXX' is not allowed to connect to this MySQL server 解决方案/如何开启MySQL的远程帐号
- [Step By Step]SAP HANA如何在SAP Business Objects Data Services中创建MySQL的连接
- Qt在mysql语句中如何使用变量
- linux下如何安装MySQL
- 如何查询Oracle,Sql Server,MySQL 中的数据库名称、数据表名称、字段名称
- mysql如何分表mysql分表的3种方法比较优点缺点
- mysql中的enum和set类型
- 中国移动该如何对待腾讯微信
- 如何将你的 MySQL 查询速度提升 300 倍
- 如何在MySQL中设置外键约束
- MySQL分类汇总(group by...with rollup)统计时,如何显示“总计”字段?
- 如何解决jsp+mysql出现的中文乱码问题
- 利用nginx访问日志如何记录mysql中的用户id详解
- 如何查询Oracle,Sql Server,MySQL 中的数据库名称、数据表名称、字段名称
- 如何高效快速地优化MySQL、SQL语句(附源码)