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