问题描述,公司项目存在多个环境,其中的beta环境有个服务总是不正常,测试和线上环境没问题,在排除了代码、处理程序运行环境的问题后,最终找到是Mysql配置问题。具体设计配置参数sql_mode
查询mysql当前的sql_mode配置:
1:查看mysql配置文件my.cnf
2:sql查询 show variables like '%sql_mode%';
MySQL5.0以上支持三种sql_mode,ANSI、TRADITIONAL和STRICT_TRANS_TABLES
1、ANSI模式:
宽松模式,更改语法和行为,使其更符合标准SQL。对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。对于本文开头中提到的错误,可以先把sql_mode设置为ANSI模式,这样便可以插入数据,而对于除数为0的结果的字段值,数据库将会用NULL值代替。
mysql> set @@sql_mode=ANSI;
2、TRADITIONAL模式:
严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误,而不仅仅是警告。用于事物时,会进行事物的回滚。 注释:一旦发现错误立即放弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。
将当前数据库模式设置为TRADITIONAL模式:
mysql> set @@sql_mode=TRADITIONAL;
3、STRICT_TRANS_TABLES模式:
严格模式,进行数据的严格校验,错误数据不能插入,报error错误。如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。
将当前数据库模式设置为STRICT_TRANS_TABLES模式:
mysql> set @@sql_mode=STRICT_TRANS_TABLES;
我们的beta配置采用了TRADITIONAL模式,而其它环境没有,部分程序再操作数据库时,并没有进行严格的类型管控,导致beta环境操作数据库失败。
网友评论