Mysql 我应该使用NULL还是空字符串来表示表列中没有数据?

Mysql 我应该使用NULL还是空字符串来表示表列中没有数据?,mysql,database,null,Mysql,Database,Null,Null或空字符串——在表列中不表示数据时,一个字符串比另一个好吗?(我特别使用MySQL,但我认为这是独立于系统的。)使用MySQL比使用MySQL有什么主要的优点/缺点,还是仅仅是程序员的偏好?Null。空字符串不是“无数据”,而是碰巧为空的数据。Null更好”“实际上表示数据,并且不会在代码中注册相同的数据。据我所知,Oracle没有区别 select 1 from (select '' as col from dual) where col is null; 大多数情况下空值更好。也

Null或空字符串——在表列中不表示数据时,一个字符串比另一个好吗?(我特别使用MySQL,但我认为这是独立于系统的。)使用MySQL比使用MySQL有什么主要的优点/缺点,还是仅仅是程序员的偏好?

Null。空字符串不是“无数据”,而是碰巧为空的数据。

Null更好”“实际上表示数据,并且不会在代码中注册相同的数据。

据我所知,Oracle没有区别

select 1 from (select '' as col  from dual) where col is null;

大多数情况下空值更好。也许在某些情况下,这没有什么区别,但它们很少。请记住,当您查询
字段=''
字段为空不相同时(至少在MySQL中是这样)。

请考虑为什么列中没有数据。这是否意味着桌子的设计太马虎了?尽管不喜欢空值,但有时它们是适当的(或足够适当),系统通常不会消亡。只是决不允许在任何候选键(主键或备用键)中使用null。

在关系数据库模型的上下文中,null表示“无值”或“未知值”。它的存在正是为了你所描述的目的


更新:抱歉,我忘了补充一点,虽然大多数(全部?)RDMBS对null使用相同的定义,但在处理null的方式上存在细微的差异。例如,MySQL和Oracle允许在一个唯一列(或一组列)中使用多个null,因为null不是一个值,不能被认为是唯一的(null!=null)。但上次我使用MS SQL Server时,它只允许一个空值。因此,您可能需要考虑RDBMS行为,以及所讨论的列是否将被约束或索引。

< P>这里有几个来自MySQL站点的链接:


我确实读过一次,一个
NULL
值是2位,其中一个空字符串只有1位。99%的情况下,这不会产生任何影响,但在一个非常大的表中,如果
NULL
'
,则最好使用
'
,如果这是真的。

始终使用NULL。考虑“我不知道这个人的电话号码是什么”(NULL)和“这个人留下空白”(空白)之间的区别。< / P> < P>使用正确的工具进行工作。NULL可以表示未提供任何值,也可以表示没有适用的值

但空字符串也是信息。它可以表示一个值是适用的,并且是给定的,但它恰好是一个空字符串

允许列同时包含NULL和“”使您有机会区分这些情况。无论如何,用一个来表示另一个是不好的


请注意,在字符串连接中,任何与NULL组合的内容都会产生NULL。例如:CONCAT(NULL,'foo')生成NULL。如果要将NULL转换为SQL表达式中的某个默认值,请学习使用COALESCE()函数。

。将缺少数据表示为关系中缺少元组


出于性能原因,您可能希望避免某些RDBMS中的联接,但请尝试设计模型,使可能丢失的信息处于单独的关系中。

仅为可空列和主表的外键创建单独的表。如果一个记录没有该列的数据,那么它在第二个表中就不会有记录。这是最干净的解决方案,您不必担心处理空字符串或赋予空字符串特殊含义。

有一个重要的例外。Bill Karwin说“CONCAT(NULL,'foo')产生NULL”,这对大多数RDBMS是正确的,但对Oracle不是

正如上面James Curran所建议的那样,Oracle选择了这个相当关键的时刻,以完全相同的方式处理空字符串和空字符串,从而背离标准SQL。然而,更糟糕的是,在连接时,它会返回非NULL值,从而破坏NULL值的含义


具体来说,在OracleConcat中(NULL,'foo')产生'foo'。感谢Oracle,我现在丢失了空值,这对您来说可能无关紧要,但在将数据传递给其他RDBMS进行进一步处理时肯定会产生影响。

我强烈不同意任何人说无条件使用空值。允许列为NULL会引入一种额外的状态,如果将列设置为notnull,则不会出现这种状态。如果不需要附加状态,请不要执行此操作。也就是说,如果您不能找出空字符串的含义和null的含义之间的差异,那么将列设置为NOTNULL并使用空字符串表示空。用两种不同的方式表示同一事物是个坏主意

大多数告诉您使用NULL的人也给出了一个例子,其中NULL的含义与空字符串不同。在这些例子中,他们是对的


然而,在大多数情况下,NULL是一种不必要的额外状态,它迫使程序员不得不处理更多的情况。正如其他人所提到的,Oracle不允许存在这种额外的状态,因为它将NULL和空字符串视为同一事物(不可能在Oracle中不允许NULL的列中存储空字符串)。

NULL是一个非值,应该从它产生的地方降级到黑暗时代。我发现处理特殊的空情况需要大量的编程,这些情况可以用默认值轻松处理

将列的默认值设置为空字符串。 强制列不允许null,这在指定默认值后很可能永远不会发生。 编写代码时,最好忽略列值为null的情况

对于NULL,我一直遇到的一个大问题是“SELECT*fromtbl WHERE column=NULL”总是返回一个空的结果集。NULL永远不能是e