哪个列类型最适合在MySQL数据库中用于布尔值?我使用boolean
,但我的同事使用tinyint(1)
。
答案 0 :(得分:131)
这些数据类型是同义词。
答案 1 :(得分:77)
我将采取不同的方法,并建议您的开发人员理解您的代码与编译器/数据库一样重要。使用boolean可能与使用tinyint做同样的事情,但它具有在语义上传达你的意图的优点,这是值得的。
如果你使用tinyint,你应该看到的唯一值是0和1并不明显。布尔值总是为真或假。
答案 2 :(得分:31)
boolean
在MySQL中不是一个独特的数据类型;它只是tinyint
的同义词。 See this page in the MySQL manual
我个人建议使用tinyint作为首选项,因为boolean不会从名称中执行您认为的操作,因此会产生潜在的误导性代码。但是在实际的层面上,它确实无关紧要 - 它们都做同样的事情,所以你不能通过任何一种方式获得或失去任何东西。
答案 3 :(得分:8)
使用枚举,简单快捷的
我不推荐使用enum或tinyint(1),因为bit(1)只需要1位来存储布尔值,而tinyint(1)需要8位。
REF
答案 4 :(得分:4)
虽然bool
和tinyint(1)
在功能上相同,但bool
应该是首选选项,因为它带有语义含义你正在尝试做什么。此外,许多ORM会将bool
转换为您的编程语言的本机布尔类型。
答案 5 :(得分:0)
使用 Dapper 连接 MySQL 的经验是确实重要。我使用以下脚本将非可空位(1)更改为可空的tinyint(1):
ALTER TABLE TableName MODIFY Setting BOOLEAN null;
然后Dapper开始抛出异常。我试着看一下脚本之前和之后的区别。并注意到位(1)已更改为tinyint(1)。
然后我跑了:ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;
这解决了这个问题。
答案 6 :(得分:0)
无论何时选择 int 或 bool 都非常重要,尤其是在可空列发挥作用时。
想象一个有多张照片的产品。你怎么知道哪张照片是产品封面?好吧,我们将使用一列来表示它。
到目前为止,product_image
表有两列:product_id
和 is_cover
酷吗?还没有。由于产品只能有一个封面,我们需要在这两列上添加唯一索引。
但是等等,如果这两列将获得唯一索引,您将如何为同一产品存储许多非封面图像?唯一索引会在这里抛出错误。
所以您可能会认为“好吧,但是您可以使用 NULL 值,因为这些被唯一索引检查忽略了”,是的,这是事实,但我们在这里失去了语言规则。
布尔类型列中 NULL 值的目的是什么?是“全部”、“任何”还是“否”? boolean 列中的空值允许我们使用唯一索引,但它也混淆了我们如何解释记录。
我会说在某些情况下整数可以用于更好的目的,因为它不受严格的真假含义的约束