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

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

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

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

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

相关问题:我应该使用NULL或者一个空字符串表示表格列中没有数据?

有帮助吗?

解决方案

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

其他提示

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

  1. 如果你开始细分空白的含义,那么你必须确保每个其他开发者以相同的方式读取和写入它。

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

  3. 您是否可以明确地确定用户何时省略了输入值,而不是故意将其留空?

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

  5. 在实践中,我从未被禁止使用此规则使用默认的,不令人惊讶的行为来读写数据。如果我需要知道差异,我使用了一个布尔字段(更容易映射到明确的UI设备)。在一个案例中,我使用了一个触发器来强制执行True => null值,但从未看到它被调用,因为BR层有效地过滤了条件。

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

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

在这里考虑状态机:你有一些具有几种状态的字段:它像你正在考虑“单元化”的状态,另一个是“有目的地为空”的状态。和第三个有一些设定值。你做的任何事情都会使得这个任务与你的程序的其余部分保持一致;这听起来像是简单的映射

NULL→未初始化的结果 "" →有目的地未设置
一个名字→初始化。

我尽量保持简单。在这种情况下,我将使名字列不可为空并允许空格。否则,在您引用此字段的任何地方,您将有三种情况需要处理:

  1. 空白名字
  2. 空名[/ li>
  3. 非空白名字
  4. 如果你选择'blank is null'或'null is blank'那么你可以选择两种情况。两个案例优于三个。

    进一步回答你的问题:输入数据的用户可能不会(也不应该)知道什么是“null”。是和它如何比较“空”。应该在系统中干净利落地解决此问题 - 而不是UI。

虽然你的例子主要用于字符串,但我喜欢说我对数字和布尔字段使用null。 帐户余额为0与我非常不同,因为它是空的。对于布尔人来说,如果人们采用真假答案进行多项选择测试,那么了解某人是回答是真是假还是根本没有回答是非常重要的。 在这些情况下不使用null将要求我有一个额外的表或不同的设置,以查看是否有人回答了问题。你可以使用例如-1表示没有填充0表示false,1表示true表示,但是你使用数字字段表示基本上是布尔值的东西。

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

我总是使用 NULL 表示未初始化的值, empty 表示故意为空值, 0 表示关闭指示符。

通过这样做,即使我没有使用它,它仍然存在,但如果我需要这种区别,我不需要做任何不同的事情。

我通常在测试 empty(),但有时我会检查 isset(),它会在 NULL <上计算 false /代码>。这对于提醒回答某些问题非常有用。如果它是 empty false 0 ,那么问题就会得到解答。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top