6

是的,另一个 NULL 与空字符串的问题。

我同意 NULL 表示未设置,而空字符串表示“空值”的想法。这是我的问题:如果列的默认值为 NULL,我如何允许用户输入该 NULL。

假设在系统上创建了一个新用户。有一个名字和姓氏字段;姓是必需的,而名字不是。创建用户时,此人将看到 2 个文本输入,一个用于第一个,一个用于最后一个。此人选择仅输入姓氏。名字在技术上没有设置。在插入期间,我检查每个字段的长度,将所有为空的字段设置为 NULL。

查看数据库时,我看到没有设置名字。立即想到的问题是,也许他们从未见过名字字段(即,由于错误)。但这种情况并非如此; 如果空白,他们就离开了。

所以,我的问题是,当接收用户输入时,您如何决定何时将字段设置为 NULL 或空字符串?你怎么知道用户希望在没有检测到焦点的情况下不设置该字段,或者他们是否删除了一个值......或......或......?

相关问题:我应该使用 NULL 还是空字符串来表示表列中没有数据?

4

8 回答 8

9

我将打破这种模式,并说我总是将 NULL 用于零长度字符串,原因如下。

  1. 如果您开始细化空白的含义,那么您必须以某种方式确保每个其他开发人员都以相同的方式读取和写入它。

  2. 你如何按字母顺序排列它?

  3. 与故意将其留空相比,您能否明确确定用户何时省略输入值?

  4. 您将如何明确地询问差异?查询屏幕用户能否使用标准输入表单语法指示 NULL 与空白?

  5. 在实践中,我从未被禁止使用默认的、使用此规则的行为来读取和写入数据。如果我需要知道区别,我使用了一个布尔字段(它更容易映射到明确的 UI 设备)。在一种情况下,我使用触发器来强制执行 True => null 值,但从未见过它被调用,因为 BR 层有效地过滤了条件。

于 2009-01-02T03:24:04.923 回答
8

如果用户提供了一个空字符串,从数据库的角度来看,我总是将其视为 null。此外,我通常会修剪我的字符串输入以删除前导/尾随空格,然后检查是否为空。这是使用 varchar() 类型在数据库中的一个小胜利,它还减少了搜索的情况,因为我只需要检查name is null而不是name is null or name = '' 你也可以采用另一种方式,将 null 转换为 ''。无论哪种方式,选择一种方式并保持一致。

于 2009-01-02T02:48:50.643 回答
6

你需要做的是弄清楚你想要什么行为。对于如何解释名称字符串,没有一个固定的代数。

想想这里的状态机:你有几个状态的字段:它看起来像你在考虑“未初始化”状态,另一个“故意空”状态和第三个具有一些设定值的状态。您所做的任何与您的程序的其余部分一致的任务都会被找到;听起来很容易映射

NULL → 未初始化的
"" → 故意取消设置
名称 → 已初始化。

于 2009-01-02T02:47:43.423 回答
2

在引用实际数据时,我几乎从不使用 NULL。当用于外键时,我会说 NULL 是有效的,但它几乎对用户输入的数据无效。可能会经常出现的一个例外是不存在的日期,例如具有“termination_date”字段的员工数据库。在这种情况下,所有当前员工在该字段中的值都应为 NULL。至于让他们实际输入一个空值,对于真正需要一个空值的值,我会在输入字段旁边放一个复选框,以便用户可以打开和关闭它以查看对应的空值(或以更用户友好的方式,没有)。启用复选框将字段设置为空时,应禁用相应的文本框,如果已关联空值,

于 2009-01-02T02:49:36.320 回答
1

我尽量保持简单。在这种情况下,我会让 first-name 列不可为空并允许空白。否则,您将在引用此字段的任何地方处理三种情况:

  1. 空白的名字
  2. 空名字
  3. 非空名

如果您选择“空白为空”或“空为空白”,那么您将面临两种情况。两个案例比三个好。

为了进一步回答您的问题:输入数据的用户可能不(也不应该)知道什么是“null”以及它与“empty”的比较。这个问题应该在系统而不是 UI 中干净一致地解决。

于 2009-01-02T02:44:07.190 回答
1

虽然您的示例主要用于字符串,但我想说我将 null 用于数字和布尔字段。账户余额 0 对我来说是非常不同的,因为它是空的。布尔值也是如此,如果人们进行了真假答案的多项选择测试,那么了解某人的答案是真假还是根本没有回答是非常重要的。在这些情况下不使用 null 将需要我有一个额外的表格或不同的设置来查看是否有人回答了问题。例如,您可以使用 -1 来表示未填写,0 表示假,1 表示真,但随后您将数字字段用于本质上是布尔值的东西。

于 2012-08-08T10:39:29.410 回答
0

我从来没有在生产代码中使用过 NULL 值。空字符串是任何应用程序的空白名称字段、电话号码或年收入的精细标记值。也就是说,我相信你可以找到一些用处,但我只是认为它被过度使用了。但是,如果我要使用 NULL 值,我想我会在任何我想表示空值的地方使用它。

于 2009-01-02T02:43:53.820 回答
0

我一直使用NULL未初始化的值、empty故意为空的值和0关闭指标。

通过一直这样做,即使我不使用它,它也在那里,但如果我需要这种区别,我不必做任何不同的事情。

我通常会测试,empty()但有时我会检查isset()评估falseNULL这对于提醒回答某些问题很有用。如果是emptyfalse0问题已回答。

于 2018-02-25T18:14:16.697 回答