TINYINT 作为替代品

假设我们有

type ENUM('fish','mammal','bird')

另一种选择是

type TINYINT UNSIGNED

CREATE TABLE AnimalTypes (
    type TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL  COMMENT "('fish','mammal','bird')",
    PRIMARY KEY(type),
    INDEX(name)
) ENGINE=InnoDB

这非常像一张多对多的桌子。

比较,无论是好于还是差于 ENUM:

  • (更糟)INSERT:需要查找 type
  • (更糟)SELECT:需要 JOIN 来获取字符串(ENUM 不费力地为你提供字符串)
  • (更好)添加新类型:只需插入此表即可。使用 ENUM,你需要执行 ALTER TABLE。
  • (相同)这两种技术(最多 255 个值)只需 1 个字节。
  • (混合)还存在数据完整性问题:TINYINT 将允许无效值; 而 ENUM 将它们设置为一个特殊的空字符串值(除非启用了严格的 SQL 模式,在这种情况下它们被拒绝)。使用 TINYINT 可以实现更好的数据完整性,方法是将其作为查找表中的外键:通过适当的查询/连接,但是到达另一个表的成本仍然很低。 (FOREIGN KEYs 不是免费的。)