因为MySQL似乎没有任何“布尔”数据类型,你'滥用'哪种数据类型存储真/假的信息在MySQL?

特别是在编写和读取PHP脚本的上下文中。

随着时间的推移,我使用并看到了几种方法:

Tinyint, varchar字段包含0/1, Varchar字段包含字符串'0'/'1'或'true'/'false' 最后枚举包含“true”/“false”两个选项的字段。

以上这些似乎都不是最佳选择。我倾向于选择tinyint 0/1变体,因为PHP中的自动类型转换相当简单地为我提供布尔值。

那么使用哪种数据类型呢?是否有我忽略的布尔值的类型设计?你认为使用一种或另一种类型有什么优点或缺点吗?


当前回答

BOOL和BOOLEAN是TINYINT(1)的同义词。0为假,其他为真。更多信息请点击这里。

其他回答

你可以使用BOOL, BOOLEAN数据类型来存储布尔值。

这些类型是TINYINT(1)的同义词。

然而,BIT(1)数据类型更适合存储布尔值(true[1]或false[0]),而TINYINT(1)更容易用于输出数据、查询等,并实现MySQL和其他数据库之间的互操作性。你也可以检查这个答案或线程。

MySQL还将BOOL, BOOLEAN数据类型转换为TINYINT(1)。

此外,阅读文档

因为MySQL(8.0.16)和MariaDB(10.2.1)都实现了CHECK约束,所以我现在使用CHECK约束

bool_val TINYINT CHECK(bool_val IN(0,1))

您将只能存储0,1或NULL,以及可以转换为0或1的值,而不会出现'1',0x00, b'1'或TRUE/FALSE等错误。

如果您不想允许使用空值,请添加NOT NULL选项

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

请注意,如果你使用TINYINT, TINYINT(1)或TINYINT(123),实际上没有什么区别。

如果你想让你的模式向上兼容,你也可以使用BOOL或BOOLEAN

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

db < > fiddle演示

这个问题已经得到了答案,但我想我要投入我的0.02美元。 我经常使用CHAR(0),其中“== true和NULL == false”。

从MySQL文档:

当您需要一个只能取的列时,CHAR(0)也是非常好的 两个值:定义为CHAR(0) NULL的列只占用一个值 位,只能取值NULL和"(空字符串)。

我厌倦了试图得到零,null,和“准确地循环PHP, MySql和POST值,所以我只是使用'是'和'No'。

这是完美无缺的工作,不需要特别的处理,不明显,容易做到。

BOOL和BOOLEAN是TINYINT(1)的同义词。0为假,其他为真。更多信息请点击这里。