除了是否应该使用NULL的讨论之外:我负责管理一个现有的数据库,它使用NULL来表示“缺失或从未输入”的数据。这与空字符串不同,空字符串表示“用户设置了此值,并选择了‘空’”。
项目中的另一位承包商坚定地站在“对我来说不存在NULL;我从不使用NULL,其他人也不应该使用NULL”的立场上。然而,令我困惑的是,由于承包商的团队确实承认“缺失/从未输入”和“故意为空或由用户标记为未知”的区别,他们在代码和存储过程中使用单个字符“Z”来表示“缺失/从未输入”,其含义与数据库中的NULL完全相同。
尽管我们共同的客户要求更改此设置,并且我支持此请求,但团队将其视为DBA远比我先进的“标准做法”;他们不愿根据我无知的要求单独更改以使用NULL。 那么,有人能帮助我消除我的无知吗?SQL专家中是否存在任何标准、小群体或甚至单个响亮的声音主张使用“Z”代替NULL?
更新
我收到了承包商的回复。当客户要求删除特殊值以允许在没有数据的列中使用NULL时,以下是他说的话:
基本上,我设计了数据库以尽可能避免使用NULL。这是我的理由:
• 字符串[VARCHAR]字段中的NULL从未必要,因为空(零长度)字符串提供完全相同的信息。
• 整数字段(例如ID值)中的NULL可以通过使用在数据中永远不会出现的值(例如,对于整数IDENTITY字段,使用-1)来处理。
• 日期字段中的NULL可能会导致日期计算中的复杂问题。例如,在计算日期差异(例如[RecoveryDate]和[OnsetDate]之间的天数差异)等计算逻辑时,如果一个或两个日期为空,则逻辑将崩溃--除非明确允许两个日期都为空。这需要额外的工作和处理。如果使用“默认”或“占位符”日期作为[RecoveryDate]和[OnsetDate](例如,“1/1/1900”),则数学计算可能显示“异常”值--但是日期逻辑不会崩溃。
NULL处理传统上是存储过程开发人员犯错误的领域。
在我作为DBA的15年中,我发现尽可能避免NULL是最好的做法。
这似乎证实了对这个问题的大多数负面反应。与其采用接受的6NF方法来设计排除NULL,我们使用特殊值来“尽可能避免NULL”。我以开放的心态发布了这个问题,我很高兴了解了关于“NULL有用/NULL有害”辩论的更多信息,但现在我已经非常自信地将“特殊值”方法标记为完全无意义。
空(零长度)字符串提供完全相同的信息。
不,它不是;在我们正在修改的现有数据库中,NULL表示“从未输入”,而空字符串表示“输入为空”。
NULL处理传统上是存储过程开发人员犯错误的领域。
是的,但那些错误已经被成千上万的开发人员犯过数千次,避免那些错误的教训和警告已知并记录下来。正如在这里提到的那样:无论您接受还是拒绝NULL,缺失值的表示是一个“已解决问题”。没有必要发明新的解决方案,只因为开发人员继续犯易于克服(易于识别)的错误。
作为一则脚注:我作为一个DBE和开发人员已经有20多年的经验(这足以让我分清数据库工程师和数据库管理员之间的区别)。在我的职业生涯中,我一直坚持“NULL值也是有用的”观点,尽管我知道有几个非常聪明的人持不同意见。我对“特殊值”方法非常怀疑,但是对于如何正确地避免NULL的学术问题并不够熟练,无法做出明确的立场。我总是喜欢学习新东西——即使在20年后我还有很多要学习的。感谢所有为使这次讨论成为有用之事做出贡献的人。
WHERE Column = NULL
,并且对于为什么没有得到任何结果感到困惑。请注意,NULL不应该用等于号(=)进行比较,而应该使用IS NULL或IS NOT NULL。 - Mike Caron