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

char或varchar

  •  1
  • Marco  · 技术社区  · 12 年前

    这可能是一个愚蠢的问题,但我需要问。。。

    我创建了一个MySQL表来处理名为 images 。在其中,我有一个属性,用于保持图像的扩展名 extension .

    大多数可接受的图像扩展是 jpg png gif bmp jpeg tiff 换句话说 4 字符长。

    现在,该属性是否应该在MySQL表中声明如下:

    extension char(4)
    

    extension varchar(4)
    

    可能对性能没有任何影响,但我确实希望模型从一开始就得到优化。。。

    任何人

    2 回复  |  直到 12 年前
        1
  •  3
  •   James Culshaw    12 年前

    取决于。。。。

    如果你从MySQL文档中看到这一点

    Value      CHAR(4)  Storage Required    VARCHAR(4)  Storage Required
    ''         '    '   4 bytes             ''          1 byte
    'ab'       'ab  '   4 bytes             'ab'        3 bytes
    'abcd'     'abcd'   4 bytes             'abcd'      5 bytes
    'abcdefgh' 'abcd'   4 bytes             'abcd'      5 bytes
    

    正如您所看到的,CHAR的4个字符占用4个字节,而VARCHAR占用5个字节。如果绝大多数扩展都是4个字符,那么CHAR将更节省空间。

    在你的情况下,我猜3将是多数,所以VARCHAR是更好的选择。

    詹姆斯:-)

        2
  •  2
  •   Andreas Wong    12 年前

    编辑,我对之前的回答做出了错误的假设。我会把摘录粘贴给你 http://dev.mysql.com/doc/refman/5.0/en/char.html (增加了重点)

    CHAR和VARCHAR类型相似,但存储和检索方式不同。从MySQL 5.0.3开始,它们在最大长度和是否保留尾部空格方面也有所不同。

    CHAR和VARCHAR类型的声明长度指示要存储的最大字符数。例如,CHAR(30)最多可以容纳30个字符。

    CHAR列的长度固定为创建表时声明的长度。长度可以是0到255之间的任何值。当CHAR值被存储时,它们被用空格填充到指定的长度。检索CHAR值时,会删除尾部空格。

    VARCHAR列中的值是可变长度的字符串。在MySQL 5.0.3之前,长度可以指定为0到255之间的值,在5.0.3及更高版本中,长度可以为0到65535。MySQL 5.0.3及更高版本中VARCHAR的有效最大长度取决于最大行大小(65535字节,在所有列之间共享)和使用的字符集。

    与CHAR相反,VARCHAR值存储为一个字节或两个字节长度的前缀加数据。长度前缀表示值中的字节数。如果值需要的字节不超过255个,则列使用一个长度字节;如果值可能需要的字节多于255个,那么列使用两个长度字节。