解决:MySQL中NULL和NOT NULL的混乱
本来,指定NOT NULL的意思是表中所有行的此属性必须有一个值。
如果没有指定或者指定为NULL,该列可以为空(NULL)。
但是,在MySQL中,你用NOT NULL,高版本的会自己解析默认值的:
- INT -> 0;
- CHAR -> ‘‘ (空值);
- DATATIME -> ‘0000-00-00 00:00:00’ 等等。
说白了,MySQL中的NOT NULL已经不是约束条件“表中所有行的此属性必须有一个值”了。并且如果字段是“字符型”,在DEFAULT情况下和NULL基本上是一样的。
注意:我在实际操作中发现,“表1″的“字段” password 是“字符型”,未指定(也就是指定为NULL);“字段” address 是“字符型”,指定为NOT NULL,在phpmyadmin中的显示如下:
表1
customerid | name | password | address | city | |
---|---|---|---|---|---|
1 | Julie Smith | NULL | Airport West |
在 MySQL 中,为一个 NOT NULL 字段设置了一个 NULL 值,如果非STRICK模式,它并不会出错;但在SQL中却会出错。
MySQL 会自动将 NULL值转化为该字段的默认值, 那怕是你在表定义时没有明确地为该字段设置默认值,一般来说MySQL还是会自动为你添加默认值的,比如为一个 NOT NULL 的整型赋 NULL 值,结果是 0。
设为not null,不赋值的话字符串会为‘‘(空值),int会为0,不会出现错误。也就是说,设为not null,空值仍可以入库。
如果设为NULL,默认值为‘‘(空值)。