如果一个人的名字为Null,那么它将如何破坏数据库?


55

我在BBC上阅读这篇文章。它讲述了一个叫珍妮弗·诺​​尔(Jenifer Null)的人的故事,以及她如何在使用在线数据库(如预订机票,网上银行等)时面对日常问题。

我并不精通数据库,因此我不经常使用它。当我创建一个网站进行学习时,服务器端表单验证使用了正则表达式。据我所知,它很乐意接受“ Null”这个名字。我还没有尝试过。

有人能解释这种情况何时发生的技术细节吗?表单验证只是做某事string == NULL还是某事?即使这样我也不认为NULL is same as "NULL"


32
该文章显然是由一名记者撰写的。空值是造成许多混乱的原因,您不会指望新闻工作者会如此混乱。
ypercubeᵀᴹ

2
所有人:带有相关问题或文章链接的评论已移至下面社区Wiki答案。请修改(或建议修改)该答案,而不要在此页面上添加其他链接。
保罗·怀特

Answers:


42

我已经看到了数据库接口(例如框架库),这些接口以空列的字符串形式返回“空”。我相信有一个可以将其打开或关闭以进行调试的标志。该标志使开发人员可以轻松确定空字段是空值还是空值的结果。这是一个糟糕的设置,尤其是在生产环境中,它将解释本文中解释的问题。

将“ null”转换为null值的反向处理应会为name字段生成应用程序错误。我希望这会很快解决。


确实-这在无类型语言的框架中非常普遍,在该框架中,所有数据都转换为字符串。自从我从事这项工作已经过去了几年,但是例如,我认为ColdFusion的早期版本存在此问题。
2013年

25

您的很大一部分困惑很可能源于新闻工作者的困惑。本文讨论使用整个应用程序系统而不仅仅是数据库的问题。完全合理,因为这是针对大量消费的写作,但是技术细节被作者掩盖或误解了。

其中许多问题可能是在应用程序层而不是数据库的API引起的。魔术值是一种反模式,很难将其淘汰。某些程序员很容易按照“有人输入'null'的方式写了一个条件?它们必须表示没有值,因为那是null的意思!” 防止SQL注入的误导尝试也可能导致上述对Null的虐待,或者夏威夷姓氏包含一个单引号,这也是标准的SQL字符串定界符。

如果业务逻辑或数据库约束期望有所不同,则将这些值错误地转换为NULL或空字符串的应用程序很容易产生错误。这自然会导致本文所述的令人沮丧的用户体验。


5
我不知道奥布莱恩是夏威夷人。
glglgl

19

本文本身包含一个指向Stack Overflow问题的链接,该问题演示了该问题。它是在Flex应用程序中的代码:

currentChild.appendChild("Fred");

会将包含单词的元素附加Fred到XML文档中,但代码如下:

currentChild.appendChild("null");

将附加一个空元素,而不是包含文本“ null”的元素。

XML本身对文本值“ NULL”没有问题,因此包含此类文本将没有问题。实际上,NULL在XML中根本没有特殊含义。


13

我认为没有提到的一件事是:我们不仅在谈论SQL。

名称可能在数据库中开始/结束...但是要到达该名称通常涉及多个通道。数据库,Sql,php,html,javascript ... Java,C#,VB,Perl,Phython,Ruby,bash,批处理等,等等,等等。

流水线中的每个步骤都可能涉及将数据从一种格式转换为另一种格式。从Sql表,到json,到xml,到CSV等...

在这个复杂的链中的任何时候,它只会出现一点点不良编程或模糊编程语言(例如Java语言的空处理)。

因此,不要将自己局限于数据库中的问题……因为它可以在“堆栈”中的任何位置。



4

关系数据库必须容纳缺失或不相关的值。例如,客户列表可以包括手机号码或性别。公司要成为客户该怎么办?公司应具有什么性别?

特殊指示符用于显示缺少值。此特殊标志为NULL。因此,草率的编程可能导致缺失值指示符NULL与詹妮弗·纳尔的姓氏混淆,也许将其姓氏解释为缺失数据而不是实际值。

这有点像开设银行帐户但不存入任何钱。余额为零。这并不意味着您没有平衡。这表示您有一个余额,其值为“ 0”。但是草率的编程可能会将零误解为“不存在”,并确定您根本没有帐户。


2

有很多写得不好的软件,甚至是框架,对于名为Null的人来说,它们的行为都会很奇怪。

但是,我们不要忘记人为因素:也许人们在屏幕和打印输出上看到该名称,并认为这是一个错误,删除该人是另一个可能的原因吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.