MySQL“NULL”问题

9

我有一张有多个列的表格。

有时候,这些列的某些字段可能为空(即在某些情况下我不使用它们)。

我的问题:

  1. 在phpmyadmin中将它们设置为NULL明智吗?

  2. “NULL”属性实际上是什么?

  3. 将它们设置为NULL是否有任何好处?

  4. 即使将其设置为null,是否仍然可以以相同的方式使用NULL字段?

6个回答

14

对于SQL的新手来说,NULL值的概念常常会造成困惑,他们通常会认为NULL和空字符串''或零值是相同的。

事实并非如此。从概念上讲,NULL意味着“缺失的未知值”,并且它与其他值有所不同。例如,要测试NULL,您不能使用算术比较运算符,如=,<或>。

如果您有可能包含“缺少未知值”的列,则必须将其设置为接受NULL。

另一方面,具有许多NULL列的表可能表明需要将其重构为更好地描述它们表示的实体的较小表。


4

3

1- 在phpmyadmin中将它们设置为NULL是明智的吗?

除非您为它们指定了默认值或插入了一些值,否则所有字段默认都为空。不需要这样做...

2-"NULL"属性到底是什么作用?

null表示您尚未为其分配任何值。

3-将它们设置为NULL会有任何收益吗?

如前所述,除非您为它们指定了默认值或插入了一些值,否则所有字段默认都为空。我认为您不会从中获得任何好处。

4-即使将其设置为null,是否仍然可以像使用NULL字段一样使用它?

一个字段具有NULL值对您有什么好处呢? 没必要这样做。


2
我认为在SO上应该禁止盲目的投票。应该总是有一个解释,这样才能进行纠正。每个人都应该注意这种投票方式。谢谢。 - Sarfraz
我猜周围有坏人。 - Sarfraz
2
字段默认情况下不是NULL,如果在创建表时将字段设置为NOT NULL。如果您没有为此字段分配默认值,并尝试插入一个没有该字段值的记录,则会导致错误。 - Decent Dabbler
1
@fireeyeboy:首先感谢您的评论,我并没有说过这点,请注意当你创建一个字段时必须明确告诉它不应为空,否则它将默认为空。 - Sarfraz
2
@ Sarfraz:好说。但我认为你应该调整你的回答来解决这个问题,以便更清楚地说明。此外,与使用NULL字段相比,有很多可以获得的好处,因为它们反映了未知值。例如,考虑一个时间段(两个日期时间列“开始(start)”和“结束(end)”)。例如,当结束是NULL时,则表示时间段的开始已知,但结束仍未知。在这种情况下,将结束设置为0000-00-00 00:00:00是不合理的,因为这是对现实的不准确描述。结束不应表示为年份零的小时零。 - Decent Dabbler
1
RDBMS 没有无缘无故地实现“可空”字段。;-) - Decent Dabbler

3

我会尝试在这里一次性回答您的问题。

NULL代表着“未知”、“没有值”或者“不适用”。所以,如果有一些列在某些情况下没有使用,那么将它们设置为NULL是合适的(因为没有其他的值是合适的)。

可以将列限制为NOT NULL,这意味着每行必须有一个值。例如,“人员”记录的“姓名”列。姓名为空是没有意义的,因为每个人都有名字。

您可以“使用”NULL列,但要注意进行比较时要小心。NULL字段永远不等于另一个字段。请检查“IS NULL”或“IS NOT NULL”。


1
简短回答你的问题:
  1. 是的,NULL表示该字段根本没有包含任何内容。如果确实如此,那么数据应该反映这一点。例如,尚未发货的订单的shipped_date。在这种情况下,NULL将准确地表示值,直到订单发货为止,因为在此之前没有有效的时间(在这种情况下,检查NULL值可能是确定哪些订单仍需要发货的有价值工具)。

  2. NULL表示该字段不包含任何内容。 "无"与值0或字符串""不同,因为它们是值。 NULL的意思大致相当于“不适用”或“我拒绝回答”。它的确切含义取决于列的上下文。当然,某些列永远不应该为NULL,并且您可以通过表设计来强制执行。

  3. 如果列中大多数字段都为NULL,则应重新考虑您如何使用该列。一般来说,大量的NULL值表示您可以更好地设计表。至于默认值,您始终可以将可空值设置为默认值为NULL。

  4. 同样的方式?NULL是唯一的值。它不等同于0、""或其他任何东西。在查询中,您必须检查IS NULL或IS NOT NULL,如果将null拉入数据集中,则必须在那里特别检查它。询问设置为NULL的列是否等于0、""或其他任何内容将返回false。


0
有时候这些列字段可能为空(即在某些情况下我不会使用它们)。
1. 在phpmyadmin中将它们设置为NULL是否明智?
是的,这就是它的作用。
2. “NULL”属性实际上是什么?
它使数据库允许将NULL作为存储在列中的值。“NOT NULL”表示列必须具有非NULL值。
3. 将它们设置为NULL是否有任何好处?
没有。如果您的逻辑要求列永远不包含NULL作为值,则最好将其设置为“NOT NULL”。将其视为断言:可以安全地假定列值永远不会为NULL,因此您无需对其进行测试。数据库会处理该断言。
4. 即使将其设置为null,是否仍然可以以相同的方式使用NULL字段?
是的。

我不确定你的意思是什么... 无论如何,NULL和NOT NULL列在每个方面都是相同的,除了NULL列可以包含NULL。

而NULL是一个奇怪的值。val = NULL永远不会成立,即使val确实是NULL。为此,您必须使用“IsNull()”、“IS NULL”或“IS NOT NULL”进行测试。请参见参考手册:比较函数和运算符


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接