在MySQL数据库中,布尔值最好使用哪种列类型?我使用的是
boolean
,但我的同事使用的是tinyint(1)
。这些数据类型是同义词。
我要采用不同的方法,并建议您的同行开发人员了解您的代码与编译器/数据库同样重要。使用boolean
可能与使用tinyint
的效果相同,但它具有语义上的优势,可以传达您的意图,这是非常有价值的。
如果您使用tinyint
,那么仅通过代码并不明显只会出现0
和1
两个值。
而boolean
始终是true
或false
。
boolean
在MySQL中不是一个独立的数据类型,它只是tinyint
的同义词。请参阅MySQL手册上的这个页面。
可以看到下面引用的例子和语句来自于 dev.mysql.com/doc/
mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false |
+------------------------+
mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true |
+------------------------+
mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true |
+------------------------+
然而,TRUE和FALSE的值仅仅是1和0的别名,如下所示:
mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true |
+--------------------------------+
mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true |
+-------------------------------+
mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false |
+-------------------------------+
mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false |
+--------------------------------+
最后两个语句显示的结果是因为2既不等于1也不等于0。
我个人建议使用tinyint,因为布尔类型从其名称上并不能清晰地表达其作用,所以可能会导致代码理解上的误导。但在实际层面上,这并不重要 -- 两者都可以完成相同的工作,所以无论使用哪种类型都不会有任何得失。
tinyint
的偏好,指出“布尔值从名称上并不像你想象的那样工作”。你能详细说明一下吗?我发现这个答案在这里非常好(https://dev59.com/dG865IYBdhLWcg3wkPaD#47404140):“...(boolean)携带了你试图做什么的语义含义”。 - Rafael Leite使用枚举是最简单和最快的。
我不建议使用枚举或tinyint(1),因为bit(1)仅需要1位来存储布尔值,而tinyint(1)需要8位。
参考资料
BIT(M) - 大约需要 (M+7)/8 字节
参见:https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html - Jensbool
和tinyint(1)
在功能上是相同的,但是bool
应该被优先选择,因为它传达了你所要做的事情的语义含义。此外,许多ORM会将bool
转换为你所使用的编程语言的本地布尔类型。我使用Dapper连接MySQL的经验是它确实很重要。我通过使用以下脚本将非空位(1)更改为可空tinyint(1):
ALTER TABLE TableName MODIFY Setting BOOLEAN null;
然后Dapper开始抛出异常。我试图查看脚本之前和之后的区别。并注意到bit(1)已更改为tinyint(1)。
然后我运行了:
ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;
这解决了问题。
boolean
视为tinyint(1)
。因此,您可以使用boolean
、true
和false
,MySQL会将它们分别视为tinyint(1)
的1
和0
。 - ADTC