使用 NULL 值或用有效值表示 NULL

Posted

技术标签:

【中文标题】使用 NULL 值或用有效值表示 NULL【英文标题】:use NULL value or represent NULL with valid value 【发布时间】:2013-08-03 10:31:28 【问题描述】:

在我的数据库中,我目前有浮动数据。所有列都设置为 NULLABLE,当缺少值时,我放在那里NULL

我的数据库太大,如果我知道,值在 0 - 100 范围内,它们可以四舍五入到小数点后 1 位。所以使用浮点数是开销,我正在考虑使用 smallint (将每个浮点数乘以 10 并将其存储为舍入数字)。现在,NULL 值呢? 我有两个选择:

    还是用NULL

    使用一些“超出范围”的值,例如 9999,来表示 NULL(并且在没有为列设置任何内容时,也将此值设为默认值)。但是,在我的查询中,我需要这样做:

    SELECT AVG(NULLIF(data, 9999)) AS data, ....

    (当我使用NULL 时,我可以只使用AVG(data),而NULL 的值不会被计算..)

什么更好用。还是有更好的技术?

【问题讨论】:

“我的数据库太大”是什么意思。查询减速?磁盘空间要求? @DanielSchneller 磁盘空间要求。随着数据类型的改变,我可以节省一半的空间,也可以做更好的搜索(我可以比较 int,但不能比较 float) 【参考方案1】:

当您使用NULL 时,意味着您将此列设置为“无”,在第二种情况下,您为您的列指定一个代表NULL 的值。

所以首先你没有设置你的列,然后你设置了一个值,显示它是NULL。这取决于你想做什么。如果您想在该列的数据库中做出承诺,请使用第二个,否则如果您只想为空,除非您填写它,否则请使用 NULL

【讨论】:

【参考方案2】:

如果NULL 功能已经存在,您为什么还要尝试“推出自己的”功能?正如您所描述的,您对NULLs 的使用是正确且完全有效的。我看不出使用幻数作为人为的 NULL 替代品可以获得任何优势;你只是介绍了错误的可能性。

TL;DR: 使用NULL

【讨论】:

【参考方案3】:

如果您可以选择实际使用NULL 本身,为什么还要使用有效数据来表示NULL

我没有看到任何好处

【讨论】:

我想,也许是数据类型一致性。我在 C++ 中使用相同的方法(使用 9999),因为没有办法将 NULL 放入原始数据类型。 谢谢...我知道可以做到,但我不确定经典数据类型的性能。我会试一试,我会看到:)【参考方案4】:

NULL 值与固定字段(float、int...)上的值占用完全相同的空间。您不能通过不使用 NULL 或其他方式来优化空间使用。对不起:)

【讨论】:

我通过将 float 更改为 smallint 来优化空间。关于 NULL 的问题只是出于性能原因和表的设计(什么更好用) 在这种情况下,仍然使用 NULL。这比对您的数据结构制定隐含规则要好。它还避免在您的查询中使用IFNULL()...

以上是关于使用 NULL 值或用有效值表示 NULL的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询结果中的NULL代表啥意思

undefined && null && void 区别

js中的null和undefined

标准使用“Z”而不是 NULL 来表示缺失数据?

将NOT NULL列插入现有表

到底是用0表示NULL,还是用NULL表示0