是的,另一个NULL vs空字符串问题。
我同意NULL意味着没有设置的想法,而空字符串意味着“一个空的值”。这是我的问题:如果列的默认值为NULL,我如何允许用户输入该NULL。
假设在系统上创建了一个新用户。有一个名字和姓氏字段;姓氏不需要姓氏。创建用户时,此人将看到2个文本输入,一个用于第一个,一个用于最后一个。该人选择仅输入姓氏。第一个名称在技术上没有设置。在插入期间,我检查每个字段的长度,将所有空字段设置为NULL。
查看数据库时,我看到未设置名字。立即想到的问题是,他们可能从未见过名字字段(即因为错误)。但这种情况并非如此;如果空白,他们就离开了。
所以,我的问题是,在接收用户输入时,如何确定何时应将字段设置为NULL或空字符串?你怎么知道用户想要在没有检测到焦点的情况下设置字段,或者他们是否删除了值......或......或......?
相关问题:Should I use NULL or an empty string to represent no data in table column?
答案 0 :(得分:8)
我将打破模式,并说我总是将NULL用于零长度字符串,原因如下。
如果你开始细分空白的含义,那么你必须确保每个其他开发者以相同的方式读取和写入它。
你如何按字母顺序排列?
您是否可以明确地确定用户何时省略了输入值,而不是故意将其留空?
您如何明确地查询差异?查询屏幕用户可以使用标准输入表单语法指示NULL与空白吗?
在实践中,我从未被禁止使用此规则使用默认的,不令人惊讶的行为来读写数据。如果我需要知道差异,我使用了一个布尔字段(更容易映射到明确的UI设备)。在一个案例中,我使用了一个触发器来强制执行True => null值,但从未看到它被调用,因为BR层有效地过滤了条件。
答案 1 :(得分:6)
如果用户提供空字符串,我总是从数据库角度将其视为空。另外,我通常会修剪我的字符串输入以删除前导/尾随空格,然后检查为空。这是使用varchar()类型的数据库中的一个小胜利,它也减少了搜索的情况,因为我只需要检查name is null
而不是name is null or name = ''
你也可以采用另一种方式,将null转换为''。无论哪种方式,选择一种方式并保持一致。
答案 2 :(得分:5)
您需要做的是弄清楚您想要的行为。关于如何解释名称字符串,没有一个固定的代数。
在这里考虑一下状态机:你的字段有几个状态:它会像你正在考虑“单元化”的状态,另一个“有目的地空”和第三个具有一些设定值的状态。你做的任何事情都会使得这个任务与你的程序的其余部分保持一致;这听起来像是简单的映射
NULL→未初始化的
“”→故意取消
名称→已初始化。
答案 3 :(得分:2)
在引用实际数据时,我几乎从不使用NULL。当用于外键时,我会说NULL是有效的,但它几乎永远不会对用户输入的数据有效。可能经常出现的一个例外是不存在的日期,例如具有“termination_date”字段的员工数据库。在这种情况下,所有当前员工在该字段中的值应为NULL。至于让它们实际输入空值,对于真正需要空值的值,我会在输入字段旁边放一个复选框,以便用户可以打开和关闭它以查看相应的值为null(或以更加用户友好的方式,没有)。当启用复选框将字段设置为null时,应禁用相应的文本框,如果已经关联了空值,则它应该从禁用状态开始,并且只有在用户取消选中空复选框后才会启用。
答案 4 :(得分:1)
我尽量保持简单。在这种情况下,我将使名字列不可为空并允许空格。否则,在您引用此字段的任何地方,您将有三种情况需要处理:
如果你选择'blank is null'或'null is blank'那么你可以选择两种情况。两个案例优于三个。
进一步回答你的问题:输入数据的用户可能不会(也不应该)知道“null”是什么以及它与“空”的比较。应该在系统中干净利落地解决此问题 - 而不是UI。
答案 5 :(得分:1)
虽然你的例子主要用于字符串,但我喜欢说我对数字和布尔字段使用null。 帐户余额为0与我非常不同,因为它是空的。对于布尔人来说,如果人们采用真假答案进行多项选择测试,那么了解某人是回答是真是假还是根本没有回答是非常重要的。 在这些情况下不使用null将要求我有一个额外的表或不同的设置,以查看是否有人回答了问题。你可以使用例如-1表示没有填充0表示false,1表示true表示,但是你使用数字字段表示基本上是布尔值的东西。
答案 6 :(得分:0)
我从未在生产代码中使用过NULL值。空字符串是任何应用程序的空白名称字段,电话号码或年收入的精细标记值。也就是说,我相信你可以找到一些用途,但我认为它过度使用了。但是,如果我 使用NULL值,我想我会在任何想要表示空值的地方使用它。
答案 7 :(得分:0)
我一直使用NULL
表示未初始化的值,empty
表示有意空值,0
表示关闭指标。
通过这样做,即使我没有使用它,它仍然存在,但如果我需要这种区别,我不必做任何不同的事情。
我通常会测试empty()
,但有时我会检查isset()
评估false
上的NULL
。这对于提醒回答某些问题非常有用。如果是empty
,false
或0
,那么问题就会得到解答。