use*_*129 8 mysql sql database database-design database-schema
借口,我熟悉NULL值和空字符串之间的语义差异.
我有一个MySQL表,我用它们的IP地址(作为一个字符串)存储了很多主机名,并想知道在主机名无法解析的情况下看起来更自然(或有效存储).
NULL值或空字符串(在这种情况下,它可能应该是VARCHAR而不是CHAR)
我倾向于NULL值,但我想确认或不确认.
在MyISAM MYSQL 中,每行保存一位而不是使用 NULL。正如这里所述:
将列声明为 NULL 可以减少允许的最大列数。对于MyISAM表,NULL列需要行中额外的空间来记录它们的值是否为NULL。每个 NULL 列需要额外一位,四舍五入到最接近的字节。
也看看这里:
此外,虽然 NULL 本身不需要任何存储空间,但如果表定义包含任何定义为 NULL 的列,则 NDBCLUSTER 每行保留 4 个字节,最多 32 个 NULL 列。(如果 MySQL Cluster 表定义了超过 32 个 NULL 列,最多 64 个 NULL 列,则每行保留 8 个字节。)
此外,它还使数据库按照此处所述更快地工作(取自stackoverflow - @DavidWinterbottom 链接对我不起作用,我添加了不同的源)
MySQL 更难优化引用可空列的查询,因为它们使索引、索引统计信息和值比较更加复杂。可为空列会占用更多存储空间,并且需要在 MySQL 内部进行特殊处理。当可为空列建立索引时,每个条目需要一个额外的字节,甚至可能导致固定大小的索引(例如单个整数列上的索引)转换为 MyISAM 中的可变大小的索引。
在大多数情况下,当与COUNT()其他聚合函数结合使用时,非 NULL 值的行为更加可预测,但您也可以根据需要看到 NULL 的行为。
正如此处所述,并非所有组(聚合)函数都会忽略 NULL,例如,对于包含 NULL 值的列,COUNT()会给您带来不同的结果。COUNT(*)
另一方面,正如其他人指出的那样,NULL 更好地反映了条目的含义 - 它是一个未知值,如果您想计算所有主机,您可能会COUNT()表现得完全一样。