一、背景
在插入数据库时,报错#1364,后来才知道是字段在创建的时候,没有设置默认值的原因。关于默认值,我们都知道设置默认值为0或者null的时候,就算我们不插入该字段,数据库也会自动按照默认值填充,那么为什么一定要设置默认值呢?
二、解释
这部分参考链接:https://segmentfault.com/q/1010000000411353
错误的原因是没启用MySQL的严格模式(strict mode),很多快捷开发环境自带的MySQL(PHPnow WAMP Appserv等),都没有启用严格模式,甚至是在一些产品环境(production environment)都忽略了这点。
非严格模式下,MySQL会容忍许多开发上的疏忽,例如把一个长度100的字符串插入到varcaht中只会截断多余的部分而不报错。严格模式对数据的格式、长度、类型等进行校验,你贴出的建表语句中指定了DEFAULT,如果此时不指定DEFAULT,在你认为会启用默认值的时候会返回#1364错误。
开发阶段最好启用严格模式,这是对我们代码严谨性的测试,严进宽出也能保证转移到产品环境和后续的数据库迁移、重构顺利。
为什么数据库要设置默认值呢?因为我们希望在插入数据时,有意或无意间被忽略的字段能够交由MySQL按你事先预想的方式处理,例如一些默认正常状态码、用户插入数据时候尚未设置的文本字段,诸如此类。
我的习惯是任何数据表的任何列都是非空(NOT NULL),在此基础上将数字默认设为0,文本默认设为’’(在PHPMyAdmin中留空)。这里涉及一个NULL和’‘的区别,对此我所知尚少,我使用’‘的原因是根据语义NULL表示“此字段值为空”,而’'表示“此字段暂未设置值”。另一个原因是在MyISAM引擎下,NULL对索引、索引统计、磁盘占用都会有额外的开销,一个允许为NULL的列,每个字段的长度都比NOT NULL的多1bit,我不确定最近几年是否有所改善,涉及到NULL的资料大概是在MySQL5.0时看过的。
三、严格模式
这段文字说的特别好,里面提到了mysql的严格模式。那么什么是严格模式呢?
1、定义
简单来说就是MySQL自身对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了char或varchar类型的字段,当写入或更新的数据超过了定义的长度也不会报错。
2、如何开启
找到mysql安装目录下的my.cnf(windows系统则是my.ini)文件
在sql_mode中加入STRICT_TRANS_TABLES则表示开启严格模式,如没有加入则表示非严格模式,修改后重启mysql即可
例如这就表示开启了严格模式:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
3、常用场景
不支持对not null字段插入null值
不支持对自增长字段插入”值
不支持text字段有默认值
注:在mysql 5.7中,是默认开启严格模式的。我们自己做本地的项目的时候,可以不开启,但是如果是做线上的项目,建议还是开启严格模式会比较好。
四、设置数据库字段的默认值
emmmmm,回归到我本来的问题,设置数据库的默认值:
1、单个字段
//alter table 数据表 modify `字段名` 字段类型 DEFAULT 默认值;
alter table 数据表 modify `字段名` VARCHAR (255) DEFAULT null;
2、同一个表的多个字段
//同一个表可以同时设置多个字段的默认值,用逗号(,)隔开即可
alter table 数据表名 modify `name` VARCHAR (255) DEFAULT null,modify `type` INT (11) DEFAULT 0,modify `company_id` INT (11) DEFAULT 0,
modify `region_id` INT (11) DEFAULT 0,modify `farm_id` INT (11) DEFAULT 0;
end