代码之家  ›  专栏  ›  技术社区  ›  Jan Hančič

为什么枚举优于int

  •  21
  • Jan Hančič  · 技术社区  · 16 年前

    我刚在我的一张桌子上做了一个“程序分析”。我有一个int类型的列,它只包含0到12之间的值(类别ID)。 MySQL说我最好用一个枚举(“0”,“1”,“2”,…,“12”)。这个类别基本上是静态的,将来不会改变,但是如果它们改变了,我可以修改这个列并将它添加到枚举列表中…

    那么为什么枚举在这种情况下更好呢?

    编辑:我对这方面的表现很感兴趣…

    5 回复  |  直到 11 年前
        1
  •  28
  •   nullability    11 年前

    简单地说,这是因为它的索引方式不同。

    在这种情况下, ENUM 说“这是13种价值观之一”,而 INT 它可以是任何整数。

    这意味着索引更容易,因为它不需要考虑那些整数的索引,你不使用“以防万一”你曾经使用过它们。

    这一切都与算法有关。

    但当它到达一个 国际的 会比 枚举 .

    在中使用数字 枚举 不过可能有点危险…就好像你把这个数字不加引号地发送给SQL一样-你最终可能会得到错误的值!

        2
  •  19
  •   Gary Richardson    16 年前

    伊克斯!在 ENUM 字段。小心。我记得的一点是你可以访问 ENUMS 按索引:如果枚举为 ENUM('A', 'B', 'C', '1', '2, '3') ,则这两个查询非常不同:

    INSERT INTO TABLE (example_col) VALUES( '1' ); -- example_col == 1
    INSERT INTO TABLE (example_col) VALUES(  1  ); -- example_col == A
    

    我假设建议是因为它限制了可以进入表中的有效值。例如,插入13应该得到默认选择。

    一个更好的选择 TINYINT 而不是 INT . 安 UNSIGNED TINYINT 范围为0到255,并且只接受 1 byte to store . 安 国际的 需要4个字节来存储。如果要约束进入表的值,可以添加 ON INSERT ON UPDATE 用于检查值的触发器。

    如果你担心 枚举 蒂尼特 ,您可以随时进行基准测试以查看不同的内容。 This article 似乎有点相关。

        3
  •  3
  •   Sklivvz    16 年前

    因为它引入了对可能值的约束。

        4
  •  2
  •   subkamran    16 年前

    我不是MySQL专家,但我的猜测是整数总是占用四个字节的空间,其中枚举根据需要的数据范围占用不同数量的空间。因为您只需要13个项目,所以使用1个字节作为您的列是可以避免的。

        5
  •  1
  •   mmaibaum    16 年前

    在Oracle上,我会有一个位图索引,它比基于散列的查找如此少量的值要快得多。(因此,我假设MySQL在查询视差或索引方面也有类似的好处。)

    有趣的是,MySQL文档建议使用“看起来像数字的东西”是枚举类型的错误选择,因为枚举值和枚举索引之间可能存在混淆。( http://dev.mysql.com/doc/refman/5.0/en/enum.html )