SQL列中char / varchar的缺省值:space(1)还是空字符串?

时间:2013-02-07 17:43:32

标签: sql-server

我通常可以在SO中找到我的问题的答案,但我找不到关于这个主题的信息(可能是我提出了错误的问题)。

背景:六年前,一些开发人员将Visual FoxPro数据库升级为SQL Server 2005(表结构和数据)。该过程引入了各种错误,现在我正在尝试修复以改善数据结构和性能(将TEXT更改为VARCHAR(MAX),一些浮动到DECIMAL,删除未使用的列...)

我之前的任务是:找到分配给sys.default_constraints中不存在相应默认对象的所有表中所有列的所有默认约束并修复它们分配空字符串到char / varchar0Decimal等......(超过30%的列被破坏...是的,我知道-_- wtf!。到目前为止,我的剧本工作顺利。

为了好玩,我在其中一个表中执行了SP_HELP来验证固定列,但注意到我没有更改的char列的默认值为(space((1))),而不是我使用的普通空字符串''

我的问题是:我应该保留这些列的默认值(space((1)))吗?或者我应该将其更改为''(更改脚本以做到这一点真的很容易)?

我敢打赌,我应该改变它(在每个插页上调用一个函数都不能免费),但是想先问一下。

PD:我不是DBA,而是一个不时使用DBA帽子的开发人员。

2 个答案:

答案 0 :(得分:2)

辩论经常是null vs a default empty string(辩论here)。在这种情况下,我认为主要关注的是应用程序的任何部分是否基于列中的单个空间执行逻辑。与此相比,存储和速度问题将是最小的,除了最大的表和最高的TPS情况之外,可能甚至可以忽略不计。我还想象很难可靠地检测insert ' 'insert ''insert space(1)之间的任何有意义的性能差异,即使你已经说过它不能免费。

<强>更新

我刚刚注意到您仅提到char列具有此默认值。在这种情况下,我认为你插入空字符串或单个空格并不重要,因为它们将被存储为空格直到列的长度:

create table #CharTest ( Chars char(2) )
insert into #CharTest select ''
insert into #CharTest select ' '
insert into #CharTest select '  '
select distinct Chars from #CharTest
-- returns 1 row!

在这一点上,我想说你可以摆脱空间,只需要空字符串默认。一个潜在的警告是,如果你有一个可以为空的char列,ANSI_PADDING在创建时就关闭了。但是,在测试ansi-nulls,char,varchar和nullibility的各种组合时,我无法想出'' = ' '为假的情况(无论如何,在SQL Server 2008 R2中)。嗯......我需要去做一些阅读。

答案 1 :(得分:1)

如果您的应用程序对此问题不可知,那么需要考虑的一件事是,零长度varchar列占用的空间比单个空间列略小。

如果列后面没有任何非空的可变长度列,则每行为列值保存1个字节,在列偏移数组中可能另外保存2个字节。

我可能会使用NULL而不是其中任何一个。