题
是的,另一个NULL vs空字符串问题。
我同意NULL意味着没有设置的想法,而空字符串意味着“一个空的值”。这是我的问题:如果列的默认值为NULL,我如何允许用户输入该NULL。
假设在系统上创建了一个新用户。有一个名字和姓氏字段;姓氏不需要姓氏。创建用户时,此人将看到2个文本输入,一个用于第一个,一个用于最后一个。该人选择仅输入姓氏。第一个名称在技术上没有设置。在插入期间,我检查每个字段的长度,将所有空字段设置为NULL。
查看数据库时,我看到未设置名字。立即想到的问题是,他们可能从未见过名字字段(即因为错误)。但这种情况并非如此;如果空白,他们就离开了。
所以,我的问题是,在接收用户输入时,如何确定何时应将字段设置为NULL或空字符串?你怎么知道用户想要在没有检测到焦点的情况下设置字段,或者他们是否删除了值......或......或......?
解决方案
在引用实际数据时,我几乎从不使用NULL。当用于外键时,我会说NULL是有效的,但它几乎永远不会对用户输入的数据有效。可能经常出现的一个例外是不存在的日期,例如具有“termination_date”的雇员数据库。领域。在这种情况下,所有当前员工在该字段中的值应为NULL。至于让它们实际输入空值,对于真正需要空值的值,我会在输入字段旁边放一个复选框,以便用户可以打开和关闭它以查看相应的值为null(或以更加用户友好的方式,没有)。当启用复选框将字段设置为null时,应禁用相应的文本框,如果已经关联了空值,则它应该从禁用状态开始,并且只有在用户取消选中空复选框后才会启用。
其他提示
我将打破模式,并说我总是将NULL用于零长度字符串,原因如下。
-
如果你开始细分空白的含义,那么你必须确保每个其他开发者以相同的方式读取和写入它。
-
你如何按字母顺序排列?
-
您是否可以明确地确定用户何时省略了输入值,而不是故意将其留空?
-
您如何明确地查询差异?查询屏幕用户可以使用标准输入表单语法指示NULL与空白吗?
-
在实践中,我从未被禁止使用此规则使用默认的,不令人惊讶的行为来读写数据。如果我需要知道差异,我使用了一个布尔字段(更容易映射到明确的UI设备)。在一个案例中,我使用了一个触发器来强制执行True => null值,但从未看到它被调用,因为BR层有效地过滤了条件。
醇>
如果用户提供空字符串,我总是从数据库角度将其视为空。另外,我通常会修剪我的字符串输入以删除前导/尾随空格,然后检查为空。这是使用varchar()类型在数据库中的小胜利,它也减少了搜索的情况,因为我只需要检查 name is null
而不是 name is null或name =''
你也可以采用另一种方式,将null转换为''。无论哪种方式,选择一种方式并保持一致。
您需要做的是弄清楚您想要的行为。关于如何解释名称字符串,没有一个固定的代数。
在这里考虑状态机:你有一些具有几种状态的字段:它像你正在考虑“单元化”的状态,另一个是“有目的地为空”的状态。和第三个有一些设定值。你做的任何事情都会使得这个任务与你的程序的其余部分保持一致;这听起来像是简单的映射
NULL→未初始化的结果
"" →有目的地未设置
一个名字→初始化。
我尽量保持简单。在这种情况下,我将使名字列不可为空并允许空格。否则,在您引用此字段的任何地方,您将有三种情况需要处理:
- 空白名字
- 空名[/ li>
- 非空白名字 醇>
如果你选择'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
,那么问题就会得到解答。