我读了一篇关于英国广播公司的文章。他们说的一个例子是,姓“ Null”的人在某些网站上输入详细信息时遇到问题。
没有给出关于他们面临的错误的解释。
但据我所知,字符串“ Null”和实际的Null值完全不同(从数据库的角度来看)。
为什么这会在数据库中引起问题?
我读了一篇关于英国广播公司的文章。他们说的一个例子是,姓“ Null”的人在某些网站上输入详细信息时遇到问题。
没有给出关于他们面临的错误的解释。
但据我所知,字符串“ Null”和实际的Null值完全不同(从数据库的角度来看)。
为什么这会在数据库中引起问题?
Answers:
它不会引起数据库问题。它会在不了解数据库的开发人员编写的应用程序中引起问题。问题的根源是许多与数据库相关的软件都将NULL记录显示为字符串NULL
。然后,当应用程序依赖于NULL记录的字符串形式(可能还使用不区分大小写的比较操作)时,则此类应用程序会将任何"null"
字符串视为NULL。因此,该应用程序将认为名称Null不存在。
解决方案是NOT NULL
在数据库中声明非空列,并且不对数据库记录应用字符串操作。大多数语言都有出色的数据库API,这些API不需要字符串级的接口。应该始终首选它们,因为它们会使其他错误(例如SQL注入)的可能性降低。
NOT NULL
将对其他人造成一系列问题。“有些人只有一个名字,没有一个姓氏和姓氏。”
为了回答您的特定问题,Web表单和数据库之间的事件链有许多步骤。如果姓氏Null
被错误地解释为NULL
值,则系统可能会拒绝完全正确的名称为无效名称。如amon所述,这可以在数据库层发生。顺便说一句,如果这是特定问题,那么该数据库也可能会受到Bobby Tables攻击的SQL注入攻击。链中可能引起问题的另一个步骤是序列化过程。
总体而言,这篇文章是关于一个更大的问题的。世界是一个大杂乱的地方,并不总是符合我们的假设。当您尝试国际化您的应用程序时,这一点尤其明显。最终,我们需要确保我们的应用程序正确处理和编码我们的数据。取决于我们的业务是由我们决定为支持日益复杂的边缘情况分配多少资源。尽管我完全支持包容性,但我会理解企业是否认为“正式被称为Prince的艺术家”需要使用Unicode字符来表示他在我们数据库中的名字。
INSERT INTO users (first, last) VALUES($first, $last)
对进行引用INSERT INTO users (first, last) VALUES(Jennifer, Null)
),则其名称不是有效的SQL关键字或列名称的每个人都将抛出错误,也不会插入其记录。原因必须更加复杂。
最有可能是编程问题。如果您在此处查看有关如何传递NULL的答案,而如果您是“ Nr。Null”,则很容易导致某些不良行为。
https://stackoverflow.com/questions/4620391/mysql-and-php-insert-null-rather-than-empty-string
您可以看到,如果某些数据元素作为NULL传递,则数据将被插入为数据库中的数据库null。
“ NULL”!=数据库为空
一些用例和相关行为...
假设姓氏在数据库中被标记为非null,现在插入数据时它将被解释为NULL并导致插入失败。
另一种情况是,假设姓氏在数据库中为空。插入了NULL先生并将其转换为与“ NULL”不同的DBNull.Value。插入之后,我们找不到Null先生,因为他的姓氏不是“ NULL”,而实际上是数据库的null值。
因此,那将是2种问题。正如@Amon指出的那样,数据库本身没有null的问题,尽管应该理解每个RDMS实例中null的处理方式,因为不同供应商之间会有差异。
我将问题归结为草率的编程和某些SQL实现的不良设计。名称为“ Null”时,应始终用引号引起来并进行解释。数据库值null始终应不带引号;但是在编写临时代码时,很容易陷入“任何事情都会做”的范式,并接受被认为是无引号形式的字符串的事物。
其他类型的数据使情况更加复杂。例如,因为解释是明确的,所以可以并且可以以任何一种形式接受数字。
现有的大多数答案都集中在应用程序的非SQL部分,但SQL也可能存在问题:
如果指示过滤掉用户姓氏不可用的记录,则不太了解SQL的人可能会编写过滤器WHERE u.lastname != 'NULL'
。由于SQL的工作方式,这似乎将检查是否u.lastname IS NOT NULL
:NULL
筛选出所有记录。NULL
保留所有非记录。
当然,对于的记录u.lastname == 'NULL'
,但在测试过程中可能没有任何此类记录。
如果SQL是由某种框架生成的,则这种可能性就更大了,在该框架中,该框架没有提供一种易于访问的方法来检查NULL
参数是否不存在,并且有人注意到“嘿,如果我传入字符串NULL
,正是我想要的!”