简单愚蠢的问题。什么更好?
Bool或Enum('y','n')?
答案 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。