【问题标题】:Enum or Bool in mysql?mysql中的枚举或布尔值?
【发布时间】:2011-05-10 00:28:03
【问题描述】:

简单愚蠢的问题。什么比较好?

Bool 还是 Enum('y','n') ?

【问题讨论】:

  • 定义“更好”?

标签: mysql enums boolean


【解决方案1】:

BOOLEAN 是 TINYINT(1) 的别名,存储为一个字节的数据。
ENUM('y','n') 也存储为 1 个字节的数据。

因此,从存储大小的角度来看,两者都不是更好。
但是,您可以将 9 存储在 BOOLEAN 字段中,它会接受它。因此,如果您只想强制两种状态,请选择 ENUM。

【讨论】:

  • 使用Enum 真的没有意义。 TinyIntBooleanEnum 要好,因为你想要的只是真/假。
  • 正如我所提到的,您可以轻松地将 9 存储在 BOOLEAN 字段中。也就是说,9 在相当多的语言中评估为 TRUE,但在 MySQL 中却不是(其中 TRUE 只是 1 的别名)
  • 使用 bit(1) 怎么样?这应该将值强制为 0 和 1
【解决方案2】:

这是将布尔值存储为枚举的问题:

SELECT count(*) FROM people WHERE is_active = true; #=> 返回 0 因为 true != 'true'

这是误导,因为:

SELECT count(*) FROM people WHERE is_active = 'true'; #=> 返回 10

如果您要编写自己的所有 SQL 查询,那么您应该知道不要将表达式传递到您的查询中,但如果您使用的是 ORM,您就会遇到麻烦,因为 ORM 通常会将表达式转换为它所查询的数据库可以理解的内容(SQLite 为 't'/'f';MySQL 为 0/1 等)

简而言之,虽然一个在字节级别上可能不会比另一个快,但布尔值应该存储为表达式,以便可以与其他表达式进行比较。

至少,我是这么看的。

【讨论】:

    【解决方案3】:

    TINYINT(1) - 它看起来像一个布尔值,所以让它成为一个。

    当布尔值 (0/1) 可用时,切勿在内部与 y 之类的内容进行比较。

    【讨论】:

      【解决方案4】:

      两者都不适合存储单个位(或布尔值)。枚举有一个查找表,并将答案存储为整数。布尔值实际上只是“TINYINT(1)”的别名,技术上它是 8 位信息。 bit 数据类型将仅存储与其定义中一样多的位(如在 varchar 类型中),因此 bit(1) 实际上只存储一位。但是,如果您只有这些字段中的一个,那么问题就没有实际意义了,因为没有任何东西会填充剩余的位,因此它们将是每行上未使用的空间(每行的空间量至少四舍五入到一个字节,通常8 位,每行)。

      【讨论】:

      • 因为是整数,取值为0和1,也可以用于比较,相当于false和true
      【解决方案5】:

      很多默认建议是使用BOOL/TINYINT(1),但正如https://stackoverflow.com/a/4180982/2045006 的答案所述,这允许TRUE 的9 种变体。

      在许多情况下这无关紧要,但如果您的列将成为唯一索引的一部分,那么这将成为一个很大的问题。

      如果您将在唯一索引中使用该列,我建议使用BIT(1)

      ENUM 也适用于唯一索引(前提是您设置了合适的 SQL 模式。)但是,我只会在您想要使用 true/false 的字符串表示而不是实际的布尔值时使用 ENUM。

      【讨论】:

        【解决方案6】:

        根据您用于与数据库交互的语言,使用枚举可能会遇到区分大小写的问题,例如,如果您的数据库使用小写“y”但您的代码需要大写“Y”。 bool/tinyint 将始终为 0 或 1(或 NULL),因此可以避免此问题。

        【讨论】:

        • 这是不正确的。 BOOLBOOLEANTINYINT 可以包含除 01NULL 之外的值。 TINYINT(1) 是一个字节,而不是一位。它可以存储从 -127 到 127 的值(如果无符号则为 0 到 255)。
        【解决方案7】:

        8 reasons不使用ENUM数据类型;
        因此,不要使用 ENUM,而是使用 booleanreference foreign table

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-19
          • 1970-01-01
          • 2023-03-04
          • 2015-07-21
          • 1970-01-01
          • 2010-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多