我应该将空的 varchar 值转换为 NULL 吗?

8kb*_*8kb 4 empty-string sql-server best-practices stored-procedures

我有一个接受各种 varchar 参数的存储过程。调用该过程的中间层代码在它提交的值方面不一致。例如,有时像“传输描述”这样的参数会被提交为 NULL,有时它会是一个空字符串。

就客户端而言,空字符串仅表示未输入值。

在插入数据之前,我应该将所有空的 varchar 参数转换为 NULL 吗?

我无法确定这是否属于保持数据完整性的最佳实践,还是一个坏主意,因为我没有代表实际提交给数据库的内容。

我应该注意到所有插入和更新都在审计日志中进行跟踪。

Mar*_*ler 8

作为 DBA,您的神圣职责是接受委托给您的任何数据,并保持原样。

字段中的 NULL 通常意味着“未输入数据”或“数据不适用”(但可以有其他含义 - 它是特定于上下文的),并且实际上可能对业务层有意义。空字符串实际上可能是用户输入和想要的。当然,我是概括性的 - 可能您得到 NULL 或 ''(空字符串)的原因是由于业务层中的一些草率编码(但我们希望不是)。

无论哪种方式,与提供中间层的人聊天,看看他们使用 NULL 还是 Empty String 的目的 - 然后从那里开始。也许他们认为他们总是传入一个空字符串(或总是 NULL)并且不知道随机性(在这种情况下,建议他们您认为应该是标准的内容),或者 NULL 真的是给他们的信息

  • +1 在这一点上,作为一名被要求维护现有软件的开发人员,当数据层神奇地改变了我明确要求它保存的内容时,我非常厌恶。需要注意的是,如果数据层实际上合并了一些业务层并强制执行业务规则(尽管这里听起来不像是这种情况) (2认同)

gbn*_*gbn 5

这是理论与实践相结合的地方:这是一个很大的灰色地带

想法:

  • NULL 进入始终存在的记录 NULL 位图。空字符串占用 2 个字节,因此 NULL 的存储效率更高
  • IS NULL 检查使用 NULL 位图 = 优化
  • 索引时,NULL向每个索引条目添加一个 NULL 位图 = 更大的索引。空字符串不会(尽管仍然是 2 个字节)。
  • 一致性为王
  • (MyCol IS NULL OR MyCol = @MyCol) 现在在 SQL Server 中进行了相当优化

就个人而言,除非有充分的理由,否则我会使用 NULL 并避免使用空字符串。主要是为了理智和一致性。胡说八道理论。

  • @gbn 我的*开发人员*同意“永远不要相信输入”,但我的*DBA*知道输入是神圣不可侵犯的(即:不应以任何方式更改并因此损坏)。可以这样想:您备份您的服务器并期望在恢复时获得相同的 100% - 您不期望备份软件凭经验决定,例如,纠正它发现的所有拼写错误。在某种程度上,数据库是您传递给它的数据的“备份”。 (3认同)