mysql字段去notnul,建议MySQL列属性尽量用 NOT NULL

例子1:

字段value2的属性不是NOT NULL

CREATE TABLE `test` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`value1` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '不为空',

`value2` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '可以为空',

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

表里保存的数据如下:

4ccc46943dfc

执行查询:SELECT * FROM test WHERE value2 != '1'

结果如下:

4ccc46943dfc

预期结果应该返回id为1、4、5的行,但是只返回id为5的行。

原因1:NOT IN、!= 等负向条件查询在有 NULL 值的情况下只返回非空行的结果集(NULL 值不会被查询)。

例子2:

执行操作:SELECT CONCAT('T','E',1,'test')

结果如下:

4ccc46943dfc

执行操作:SELECT CONCAT('T','E',null,'test')

结果如下:

4ccc46943dfc

原因2:使用 concat 函数拼接时,首先要对各个字段进行非 NULL 判断,否则只要任何一个字段为空都会造成拼接的结果为 NULL

例子3:

4ccc46943dfc

执行操作:SELECT COUNT(value2) FROM test;

结果如下:

4ccc46943dfc

原因3:当用count函数进行统计时,NULL 列不会计入统计

原因4:NULL 列需要更多的存储空间,一般需要一个额外的字节作为判断是否为 NULL 的标志位。

1、空值是不占用空间的

2、mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释:

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

NULL列需要在行中额外的空间来记录它们的值是否为NULL。对于MyISAM表,每个空列都多取一位,四舍五入到最近的字节。

打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。

“空值” 和 “NULL” 的概念:

4ccc46943dfc

因为NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。(待认证)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值