Mysql 最好使用空值作为'';还是作为空?

Mysql 最好使用空值作为'';还是作为空?,mysql,ruby-on-rails,database,postgresql,database-design,Mysql,Ruby On Rails,Database,Postgresql,Database Design,数据库架构 我有以下字段: 标题(字符串) 副标题 说明(字符串) 最好将默认值设置为空字符串“”还是空字符串 为了获得更好的读/写和大小存储性能,通常的合同是: NULL表示“无可用信息” ”的意思是“有可用的信息。它只是空的。” 除此之外,自从在任何语言(而不仅仅是SQL)中发明了NULL以来,还有很多哲学上的讨论 这里唯一的技术要点是:在PostgreSQL中,NULL可以比长度为零的字符串更有效地存储。如果这对你来说真的很重要。。。我们不知道。您应该始终使用NULL来表示列没有值

数据库架构

我有以下字段:

  • 标题(字符串)
  • 副标题
  • 说明(字符串)
最好将默认值设置为空字符串“”还是空字符串

为了获得更好的读/写和大小存储性能,通常的合同是:

  • NULL
    表示“无可用信息”
  • 的意思是“有可用的信息。它只是空的。”
除此之外,自从在任何语言(而不仅仅是SQL)中发明了
NULL
以来,还有很多哲学上的讨论


这里唯一的技术要点是:在PostgreSQL中,NULL可以比长度为零的字符串更有效地存储。如果这对你来说真的很重要。。。我们不知道。

您应该始终使用NULL来表示列没有值,因为即使是空字符串也是值。

您需要确定“NULL”和空字符串的值在应用程序中是否有不同的含义,或者可能两者都表示“无数据”。如果是后一种情况,那么这通常只是偏好的问题,但您必须是后续的-尽量不要在给定字段中混合“null”值和空值

通常,“null”给出了更好的“无数据”概念,但与空字符串相比,它在应用程序中使用起来更麻烦。但是使用空字符串而不是空字符串可能会被视为过早的优化,并且在将来的某个时候不可能引入需要区分空字符串和空字符串的功能

另一方面,有些DBMS不在字符串列中存储空值,只存储空字符串。我会使用空值,但使用建立良好且有文档记录的合同(即“此字段从不包含空值,空标题表示无标题”,在列上强制使用NOT null约束),您可以采用任何您喜欢的方法

如果您关心性能,则需要阅读正在使用的DBMS文档,并自行进行一些测试。如果您认为空值非常频繁,您可以检查“稀疏列”是否有帮助-一些DBMS将其作为有效存储频繁出现的空值的手段引入,但它们通常有一些缺点,例如检索非空值时的一般(通常不是很大)性能损失,或者类似的事情


当然,你必须考虑客户的期望。但是,当您创建客户端尚未访问的数据库时,由您决定并适当记录它。

仅当数据未知或不适用时才使用空值。在所有其他情况下,使用“”(空值)由于在编写涉及空值的数据查询时需要特别考虑,这通常很困难。

这并不严格适用于您的情况,但为了完整性,我将提到它:不强制使用空外键

如果有一个字段
foreign\u id
是引用其他表的外键,则只有当
foreign\u id
包含非空值时,才会强制执行该字段


顺便说一句,甲骨文。VARCHAR2保证继续以这种方式运行,而VARCHAR可能(有一天)被更改为符合SQL标准,并区分空字符串和NULL。其他的DBMSes(我所知道的)确实做到了这一点。

<P>大多数人都已经说过了,但是我认为如果你最终认为使用NULL或“”作为“没有价值”(简单地说)是50/50的话,还有一件事要考虑。 在MySQL中,如果列的条件为负值,则不会“捕获”NULL值。例如

where column != 'text'
将仅返回“column”不具有值“text”的行,但不会找到“column”为NULL的行,如果要同时查找这些行,则必须使用:

where column != 'text' OR column IS NULL
我自己仍然更喜欢使用NULL并在保存之前将空字符串更改为nil,我认为最好知道“空值”在数据库中始终为NULL


另一方面,在某些情况下,可能需要使用“无值”(NULL)和“空值”(“”)之间的差异。但在某些应用程序中,我从未遇到过这种情况。

视情况而定。你知道这个值是空的吗?例:已知此人没有中间首字母

还是你只是不知道?示例:您收到一张表单,其中“中间首字母”字段留空

专家意见:避免空值 ,他与关系数据模型()的创建者/发现者合作,明确表示,“不,不应该使用null。”。读他的书进行大量讨论

他和其他专家一起认为,对于各种各样的理论和实践问题,空值带来了太多的风险、混乱和问题,使它们变得不值得

解决方案:

  • 在的每一列上添加约束
  • 在有意义的地方,为每列添加一个默认值。对于文本类型列,默认值可以是空字符串(“”)。或者默认值可能是您根据需要任意选择并一致使用的特定措辞,例如“空”或“不可用”。在某些列上,您可能不需要默认值,这意味着您希望在用户/应用程序未提供值的情况下拒绝记录的插入或更新
例外 以上是一条很好的规则,我习惯性地遵循它。然而,每一条规则都有例外。在非常罕见的情况下,我允许空值作为例外

例外示例:在使用包含数百万行的In表时,在中。我需要重复搜索尚未记录值的行(缺少值)。我不能存储空字符串,因为Postgres强制执行只存储有效XML的规则,而空字符串不是有效的XML文档。所以我允许在XML列中使用null