布尔值vs tinyint(1)表示MySQL中的布尔值

时间:2010-09-20 13:21:52

标签: sql mysql

哪个列类型最适合在MySQL数据库中用于布尔值?我使用boolean,但我的同事使用tinyint(1)

7 个答案:

答案 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

TINYINT vs ENUM(0, 1) for boolean values in MySQL

答案 4 :(得分:4)

虽然booltinyint(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_idis_cover

酷吗?还没有。由于产品只能有一个封面,我们需要在这两列上添加唯一索引。

但是等等,如果这两列将获得唯一索引,您将如何为同一产品存储许多非封面图像?唯一索引会在这里抛出错误。

所以您可能会认为“好吧,但是您可以使用 NULL 值,因为这些被唯一索引检查忽略了”,是的,这是事实,但我们在这里失去了语言规则。

布尔类型列中 NULL 值的目的是什么?是“全部”、“任何”还是“否”? boolean 列中的空值允许我们使用唯一索引,但它也混淆了我们如何解释记录。

我会说在某些情况下整数可以用于更好的目的,因为它不受严格的真假含义的约束