我有一个数据库,其中包含一个字段,其中包含与请求关联的许可证号。许可证号码是13位数,但可能不会签发许可证。
话虽如此,我目前将字段定义为允许NULL的字符(13)。我被要求将其更改为varchar(13),因为char,如果为NULL,仍然使用全长。
这是否可取?除了空间使用之外,还有其他优点或缺点吗?
我知道在一个理想的关系系统中,许可证号码将存储在另一个相关的表中,以避免使用NULL,但它就是这样。
答案 0 :(得分:1)
如果字段应该总是正好是13个字符,那么我可能会将其保留为CHAR(13)。
另外,BOL的一个有趣的说明:
如果SET ANSI_PADDING为OFF时为OFF CREATE TABLE或ALTER TABLE是 执行,是一个char列 定义为NULL的处理方式为varchar。
编辑:您希望该字段为NULL的频率如何?如果它将在95%的时间内填充,那么进行此更改几乎是不值得的。
答案 1 :(得分:1)
好吧,如果您不必使用尽可能多的空间,那么您可以在内存中放入更多页面。如果你能做到这一点,那么你的系统将运行得更快。这看起来似乎微不足道,但我最近在客户端的表上调整了数据类型,将读取量减少了25%,CPU减少了大约20%。
至于哪种更易于使用,David Stratton提到的好处值得注意。我讨厌在字符串构建中使用trim函数。
答案 2 :(得分:0)
我知道的最大优势(一般情况下,不一定是你的特定情况)是在代码中,如果你使用varchar,你不必每次都想要显示Trim函数。在获取FirstName字段和LastName字段并将它们组合成FullName时,我遇到了很多。它只是令人讨厌并且使代码的可读性降低。
答案 3 :(得分:0)
如果您使用的是sql server 2008,则应该查看行压缩以及可能是稀疏字段(如果列的更多是~60%null)。
如果所有填充的字段都使用该数量,我会将数据类型保留为char(13)。
行压缩信息: http://msdn.microsoft.com/en-us/library/cc280449.aspx