一、 MySQL建表,字段需设置为非空,需设置字段默认值。
原因是没启用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时看过的。
从应用层php角度来看,可以减少程序判断代码,比如你要插入一条记录,如果没默认值,你是不是得先判断该字段对应变量是否被设置,如果没有,你得通过php把该变量置为''或者0,否则这条insert语句会报异常,如果设了默认值,该部判断可直接略过
为什么mysql字段要设置为not null?
首先 我们创建一个表 user字段为允许null,age字段为允许null 都无默认值 age设定默认值Empty String
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL auto_increment,
`user` varchar(45) default NULL,
`age` varchar(45) default '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后导入2条数据
INSERT INTO `test`(age) VALUES ('10');
INSERT INTO `test`(user) VALUES ('zhangsan');
然后仔细观察
可以看到 给了默认值的age默认为 而uesr没给默认值则为Null
下边我们来执行查询
首先查询用户为空的
然后查询年龄为空的
为什么user我空查不到 而age同样为空确能查到呢?
如果你使用的是java等强类型语言那么你很容易理解 ,而使用php等若类型语言就需要注意了
请注意 MYSQL不是PHP,NULL不等于空字符串 更不会做类型转换!
而我们使用做WEB开发的时候,有的地方插入记录 是指定空字符串,有的地方插入记录没有指定值,如果字段设置默认值,那么查询的时候只需要 select * from test where user =‘’即可 所以MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。 默认为0同理