Char vs Varchar并不总是填充

时间:2010-07-02 20:17:45

标签: sql-server database-design types

我有一个数据库,其中包含一个字段,其中包含与请求关联的许可证号。许可证号码是13位数,但可能不会签发许可证。

话虽如此,我目前将字段定义为允许NULL的字符(13)。我被要求将其更改为varchar(13),因为char,如果为NULL,仍然使用全长。

这是否可取?除了空间使用之外,还有其他优点或缺点吗?

我知道在一个理想的关​​系系统中,许可证号码将存储在另一个相关的表中,以避免使用NULL,但它就是这样。

4 个答案:

答案 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

稀疏列: http://msdn.microsoft.com/en-us/library/cc280604.aspx