首页 > 编程知识 正文

数据库smallint,字段不能为null怎么办

时间:2023-05-05 21:06:45 阅读:57375 作者:1918

目录1对程序的影响2对查询结果的影响2.1聚合函数count ()不正确2.1=and!=失效2.3 NULL和其他值运算结果是NULL2.4对distinct、group by、order by等排序结果的影响3对索引的影响4对存储区域的影响

目前,在大多数开发中,所有字段都设置为NOT NULL,并提供默认值。 默认值通常设置为:

整形。 通常使用0作为默认值。 3358www.Sina.com/、默认空字符串字符串、默认1970-01-01 08:00:01或默认000-00-000033600001 如果建议,最好不要使用此默认时间格式。 但是,为什么要设定为NOT NULL?

1对程序的影响在MySql中,如果不主动设置为NOT NULL,则插入数据时的默认值为NULL。

NULL和NOT NULL的含义不同。 NULL被认为此列的值未知,NULL被认为我们知道此值。 但是,他只是空的。

在大多数程序中,如果不处理空值,可能会出现空指针等问题。

2对查询结果的影响2.1聚合函数count (不准确的count )1)是统计表中的行数。

count(* )是统计表中的行数。

count(name )统计表中非空列。

2.1=与!=对于空值的列,'='表达式无法确定禁用。 以下对name的查询不成立,必须使用is NULL :

表中只有一条有名字的记录。 这个时候,我会查一下名字!=可以看出a预期的结果应该是想调查剩下的两个记录,与预期的结果不一致。

2.3 NULL与其他值的运算结果为空值,与其他值的运算结果为空值,包含式的值也为空值。

用户表中的第二条记录:

age为NULL,因此1之后也为NULL; name为NULL,进行concat运算后,结果也为NULL。

如果运算为NULL,则结果为NULL

2.4对distinct、group by、order by等排序结果的影响distinct和group by认为所有空值都相等;

对order by来说,升序的空值排在前列;

3对索引的影响表的索引如下

如果同时使用is NULL和范围查询,则可以照常使用索引。

在数据库中插入数据并继续测试,发现NULL列的值变多后,索引不再有效。时间

执行查询SQL的过程如下:

首先,连接器连接到指定的数据库,然后检查查询缓存中是否存在此语句,如果有,直接返回结果。 如果缓存未命中,则需要分析器对SQL语句进行语法分析,并进行词法分析以确定SQL语句是否正确。 接下来,优化程序优化sql执行时,它将选择使用哪个索引是合理的,并确定sql语句具体如何执行的方案。 最后的执行机构询问语句的执行、有无权限,并返回执行结果。 从上面的测试结果可以看出,如果索引列中的NULL过多,则优化程序在选择索引时会变得复杂,难以优化,因此放弃使用索引。

4对存储空间的影响数据库中的一行也会作为行存储在最终磁盘文件中。 对于InnoDB,有四种原始存储格式:冗馀、压缩、动态和压缩。

InnoDB的默认原始存储格式为COMPACT,存储格式如下所示: 虚线部分表示可能不一定存在。

现象解释::有多个字段时按相反顺序保存。 保存格式为十六进制,如果没有字段变长,则不需要此部分。变长字段长度列表:用于存储我们记录的值为NULL的情况。 存在多个NULL值时也按相反顺序存储,必须是8bit的整数倍。 小于8bit时,在高位添加0。 1表示NULL,0表示不是NULL。 如果都是NOT NULL,则这不存在。 3358www.Sina.com/:1:一行记录的唯一标志,使用未指定主键时自动生成的ROW_ID作为主键。NULL值列表:事务ID。ROW_ID:回滚指针。TRX_ID为了明确这个存储格式问题,我做了一个表格进行测试。 此表中只有c1字段为NOT NULL,否则为NULL。

可变字段长度列表: c1和c3字段值的长度分别为1和2,因此将长度转换为十六进制数时为0x010x02,反过来为0x020x01。

空值列表:由于存在允许空值的列,因此c2、c3、c4分别为010,逆序后也相同,同时高位补充0 8位以上,结果为00000010。

行数据的格式如下。

如果将所有字段设置为NOT NULL并插入数据a、bb、ccc和dddd,则保存格式如下:

因此,空值本身不占用存储区域,但是如果存在空值,则额外占用1字节的标志位的区域。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。