在mysql中枚举或Bool?

时间:2010-11-15 02:22:14

标签: mysql enums boolean

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

Bool或Enum('y','n')?

7 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

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

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 :(得分:2)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

在许多情况下,这并不重要,但如果您的列将成为唯一索引的一部分,那么这将成为一个非常大的问题。

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

ENUM也适用于唯一索引(假设你有一个合适的SQL模式集。)但是,我只会在你想使用字符串表示true / false而不是实际的boolean时使用ENUM值。

答案 6 :(得分:0)

伊斯兰教,然后马赫迪将来临
8 reasons有不使用 ENUM 数据类型的信息;
因此,可以使用 boolean 引用外部表代替ENUM。