代码之家  ›  专栏  ›  技术社区  ›  DCNYAM

char与varchar(不总是填充时)

  •  1
  • DCNYAM  · 技术社区  · 14 年前

    我有一个数据库,其中有一个字段保存与请求相关联的许可证编号。许可证编号为13位,但不得签发许可证。

    有了这一点,我现在将字段定义为一个允许空值的char(13)。我被要求将其更改为varchar(13),因为char的如果为空,仍然使用完整的长度。

    这是明智之举吗?除了空间使用,还有其他的优点或缺点吗?

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

    4 回复  |  直到 14 年前
        1
  •  1
  •   Anon246    14 年前

    好吧,如果你不需要使用那么多的空间,那么你可以在内存中容纳更多的页面。如果你能做到这一点,那么你的系统就会运行得更快。这看起来微不足道,但我最近只是在客户端的一个表上调整了数据类型,将读取量减少了25%,CPU减少了大约20%。

    至于哪个更容易合作,大卫·斯特拉顿提到的好处是值得注意的。我不喜欢在字符串构建中使用修剪函数。

        2
  •  1
  •   GalacticCowboy    14 年前

    如果字段总是13个字符,那么我可能会将其保留为char(13)。

    另外,Bol的一个有趣的注释:

    如果设置Ansi_padding为关闭,则 创建表或更改表是 已执行,char列 定义为空的将作为varchar处理。

    编辑 :您希望该字段为空的频率是多少?如果95%的时间内人口都在这里,那么做出这种改变是不值得的。

        3
  •  0
  •   David    14 年前

    我知道的最大优势(一般来说,不一定是您的具体情况)是,在代码中,如果您使用varchar,则不必每次希望它显示时都使用trim函数。当我把firstname字段和lastname字段合并成一个全名时,我经常遇到这种情况。这很烦人,使代码的可读性降低。

        4
  •  0
  •   Jason Horner    14 年前

    如果您使用的是SQL Server 2008,那么如果列的空值大于60%,那么您应该查看行压缩和稀疏字段。

    如果所有填充字段都使用这个值,那么我将把数据类型保留为char(13)。

    行压缩信息: http://msdn.microsoft.com/en-us/library/cc280449.aspx

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