因为MySQL似乎没有任何“布尔”数据类型,你'滥用'哪种数据类型存储真/假的信息在MySQL?
特别是在编写和读取PHP脚本的上下文中。
随着时间的推移,我使用并看到了几种方法:
Tinyint, varchar字段包含0/1,
Varchar字段包含字符串'0'/'1'或'true'/'false'
最后枚举包含“true”/“false”两个选项的字段。
以上这些似乎都不是最佳选择。我倾向于选择tinyint 0/1变体,因为PHP中的自动类型转换相当简单地为我提供布尔值。
那么使用哪种数据类型呢?是否有我忽略的布尔值的类型设计?你认为使用一种或另一种类型有什么优点或缺点吗?
对于MySQL 5.0.3及更高版本,您可以使用BIT。手册上说:
从MySQL 5.0.3开始,BIT数据类型用于存储位字段
值。一种BIT(M)类型允许存储M位值。M能量程
从1到64。
否则,根据MySQL手册,你可以使用BOOL或BOOLEAN,这是tinyint(1)的别名:
Bool, Boolean:这些类型是TINYINT(1)的同义词。值为
0被认为是假的。非零
值被认为是真。
MySQL还声明:
我们打算实现全布尔值
类型搬运,按照
标准SQL,在未来的MySQL
释放。
引用:http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
这是一个优雅的解决方案,我非常欣赏,因为它使用零数据字节:
some_flag CHAR(0) DEFAULT NULL
如果要将其设置为true,则设置some_flag = ",如果要将其设置为false,则设置some_flag = NULL。
然后测试是否为真,检查some_flag是否为非空,测试是否为假,检查some_flag是否为空。
(这个方法在Jon Warren Lentz, Baron Schwartz和Arjen Lentz的“高性能MySQL:优化,备份,复制和更多”中有描述。)
对于MySQL 5.0.3及更高版本,您可以使用BIT。手册上说:
从MySQL 5.0.3开始,BIT数据类型用于存储位字段
值。一种BIT(M)类型允许存储M位值。M能量程
从1到64。
否则,根据MySQL手册,你可以使用BOOL或BOOLEAN,这是tinyint(1)的别名:
Bool, Boolean:这些类型是TINYINT(1)的同义词。值为
0被认为是假的。非零
值被认为是真。
MySQL还声明:
我们打算实现全布尔值
类型搬运,按照
标准SQL,在未来的MySQL
释放。
引用:http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
因为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演示