在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
经常用mysql的人可能会遇到下面几种情况: 1、我字段类型是not null,为什么我可以插入空值 2、为什么not null的效率比null高 3、判断字段不为空的时候,到底要用 select * from table where column <> '' 还是要用 select * from table where column is not null 带着上面几个疑问,我们来简单的研究一下null 和 not null 到底有什么不一样,他们之间的区别是什么以及各自的效率问题。 首先,我们要搞清楚“空值” 和 “NULL” 的概念: 1、空值是不占用空间的 2、mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释
打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。 搞清楚“空值”和“NULL”的概念之后,问题基本就明了了,我们做个例子测试一下: CREATE TABLE `codetc` ( `col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ) ENGINE = MYISAM ; 插入数据: INSERT INTO `codetc` VALUES (null,1); mysql发生错误:
再来一条 INSERT INTO `codetc` VALUES ('',1); 成功插入。 可见,NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”,上面的问题1也就有答案了。 对于问题2,上面我们已经说过了,NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。 而且B树索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。 我们再向codetc的表中插入几条数据: INSERT INTO `codetc` VALUES ('', NULL); INSERT INTO `codetc` VALUES ('1', '2'); 现在根据需求,我要统计codetc表中col1不为空的所有数据,我是该用“<> ''” 还是 “IS NOT NULL” 呢,让我们来看一下结果的区别。 SELECT * FROM `codetc` WHERE col1 IS NOT NULL; SELECT * FROM `codetc` WHERE col1 <> ''; 可以看到,结果迥然不同,所以在实际情况中,我们一定要根据业务需求,搞清楚是否需要使用null或者not null。 注意:MySQL字段尽量避免NULL,应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,而且对表索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。 mysql 设置字段 not null 变成null 语句: ALTER TABLE 表名 MODIFY 字段名 VARCHAR(20) DEFAULT NULL 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对极客世界的支持。如果你想了解更多相关内容请查看下面相关链接 |
请发表评论