我应该使用NULL还是空字符串表示表列中没有数据吗?
空字符串或者空字符串-在表列中不表示任何数据时,一个比另一个好吗? (我专门使用MySQL,但我认为这是与系统无关的。)使用一个相对于另一个是否有主要的优点/缺点,还是仅仅是程序员偏爱?
解决方案
空值。空字符串不是"无数据",而是恰好为空的数据。
空值更好""实际上表示数据,并且不会在代码中注册相同的数据
据我所知,Oracle没有区分差异。
select 1 from (select '' as col from dual) where col is null;
在大多数情况下,null会更好。在某些情况下,它的作用不大,但很少。请记住,当我们查询" field ="与" field is null"不同时(至少在MySQL中是这样)。
考虑一下为什么该列中没有数据。这是否意味着桌子设计草率?尽管不喜欢null,但有时它们是适当的(或者足够适当的),并且系统通常不会消失。只是永远不要在候选键(主键或者替代键)的任何内容中都允许为null。
在关系数据库模型的上下文中,null表示"无值"或者"未知值"。出于我们描述的目的而存在。
更新:对不起,我忘了补充一点,尽管大多数(全部?)RDMBS都使用相同的null定义,但是在处理null方面存在细微的差异。例如,MySQL和Oracle在UNIQUE列(或者一组列)中允许多个null,因为null不是值,并且不能被认为是唯一的(null!= null)。但是上一次我使用MS SQL Server时,它只允许一个null。因此,我们可能需要考虑RDBMS行为,以及所讨论的列是否将受到约束或者建立索引。
这是来自MySQL站点的几个链接:
http://dev.mysql.com/doc/refman/5.0/en/problems-with-null.html
http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
我读过一次," NULL"值是2位,而空字符串只有1位。 99%的时间没有任何区别,但是在一个很大的表中,如果NULL
或者''
无关紧要,那么最好使用''
。
始终使用NULL。考虑"我不知道此人的电话号码是什么"(NULL)和"此人将其留空"(空白)之间的区别。
使用正确的工具完成工作。 NULL可以表示尚未提供任何值,或者可以表示没有可用的值。
但是空字符串也是信息。它可以表示一个值是适用的,并且已经给出,但是它恰好是一个空字符串。
允许列同时包含NULL和'',则使我们有机会区分这些情况。无论如何,用一个来表示另一个并不好。
请注意,在字符串连接中,任何与NULL组合的值都会产生NULL。例如:CONCAT(NULL,'foo')产生NULL。如果要将NULL转换为SQL表达式中的某些默认值,请学习使用COALESCE()函数。
两者都不。将不存在数据表示为关系中不存在元组。
出于性能原因,我们可能希望避免在某些RDBMS中加入,但应尝试设计模型,以使可能丢失的信息处于单独的关系中。
仅为可为空的列和主表的外键创建一个单独的表。如果记录中没有该列的数据,则第二个表中将没有记录。这是最干净的解决方案,我们不必担心处理null或者为空字符串赋予特殊含义。
有一个重要的例外。 Bill Karwin说" CONCAT(NULL,'foo')产生NULL"对于大多数RDBMS都是正确的,但对于Oracle则不是。
正如上面的James Curran所建议的那样,Oracle选择了这个相当关键的关头,通过完全相同地对待NULL和空字符串来偏离标准SQL。更糟糕的是,不仅将它们视为相同,实际上还可以通过在连接时返回NULL以外的值来破坏NULL值的含义。
具体来说,在oracle中,CONCAT(NULL,'foo')产生'foo'。感谢Oracle,我现在丢失了空值,这对我们可能并不重要,但是当将数据传递给其他RDBMS进行进一步处理时,可以肯定会有所不同。
我坚决不同意说无条件使用NULL的每个人。如果将列设置为NOT NULL,则允许列为NULL会引入一个添加状态。如果不需要其他状态,请不要执行此操作。也就是说,如果我们无法在空字符串的含义和null的含义之间求出差,则将列设置为NOT NULL并使用空字符串表示空。用两种不同的方式表示同一件事是一个坏主意。
告诉我们使用NULL的大多数人还给出了一个示例,其中NULL表示的含义不同于空字符串。在这些示例中,它们是正确的。
但是,在大多数情况下,NULL是不必要的额外状态,只会迫使程序员不得不处理更多的情况。正如其他人提到的那样,Oracle不允许存在这种额外状态,因为它会将NULL和空字符串视为同一事物(不可能在Oracle中不允许空的列中存储空字符串)。
NULL是一个非值,应该降级为从其出现的黑暗时代。我发现处理特殊的NULL情况需要很简单的程序,这些情况可以很容易地使用默认值来处理。
将列的默认值设置为空字符串。
强制该列不允许为空,一旦分配了默认值,该值很可能永远不会发生。
幸福地编写代码,而忽略列值为null的情况。
我一直对NULL遇到的一个巨大问题是" SELECT * from tbl WHERE column = NULL"将始终返回空结果集。 NULL永远不能等于任何东西,包括NULL。特殊关键字" column is null"是检查某项是否为null的唯一方法。如果我们退出null,则比较将成功:" column =""返回7行。
我从头开始完成了两个主要的数据库实现,最后我后悔使用NULL。下次,对我来说没有NULL!