在 MySQL 数据库中,哪种列类型最适合用于布尔值?我使用 boolean,但我的同事使用 tinyint(1)。
boolean
tinyint(1)
这些数据类型是同义词。
在 MySQL 中,boolean不是一种独特的数据类型; 它只是 tinyint.请参阅 MySQL 手册中的这一页的同义词。 请参阅下面 dev.mysql.com/doc/中的引号和示例
tinyint
dev.mysql.com/doc/
BOOL,BOOLEAN 这些类型是 TINYINT (1)的同义词。值为零 非零值被认为为真:
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 作为首选项,因为布尔值并不像您认为的那样从名称中进行操作,所以它可能会导致潜在的误导性代码。但在实际层面上,这真的没有关系-,它们都做同样的事情,所以你不会得到或失去任何东西,使用任何一个。
使用 枚举是最容易和最快的
我不推荐使用 enum 或 tinyint (1) ,因为 bit (1)只需要1位来存储布尔值,而 tinyint (1)需要8位。
裁判
对于 MySQL 中的布尔值,TINYINT vs ENUM (0,1)
我将在这里采用一种不同的方法,并建议您的开发人员同事理解您的代码和编译器/数据库理解您的代码一样重要。使用 boolean可能做同样的事情使用 tinyint,但它有优势的 语义上的传达你的 意图是什么,这是值得的东西。
如果您使用 tinyint,那么您应该看到的唯一值是 0和 1,这一点并不明显。 boolean总是 true或 false。
0
1
true
false
我使用 衣冠楚楚连接到 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;
这样问题就解决了。
虽然 bool和 tinyint(1)确实是 功能上相同的,但是 bool应该是首选,因为它承载了您正在尝试做的事情的语义含义。此外,许多 ORM 会将 bool转换为编程语言的本机布尔类型。
bool
无论什么时候选择 int 或 bool,特别是当可空列出现时,这一点非常重要。
想象一个有多张照片的产品。你怎么知道哪张照片可以作为产品封面?我们会用一列来表示。
到目前为止,product_image表有两列: product_id和 is_cover
product_image
product_id
is_cover
好吗?还没有。由于产品只能有一个封面,我们需要在这两列上添加一个惟一的索引。
但是等等,如果这两个列将得到一个唯一的索引,你将如何存储同一产品的许多非封面图像?唯一索引将在这里抛出一个错误。
所以你可能会想“好的,但是你可以使用 NULL 值,因为这些值被唯一的索引检查省略了”,是的,这是真的,但是我们在这里失去了语言规则。
在布尔类型列中使用 NULL 值的目的是什么?是“全部”,“任何”还是“不”?布尔值列中的 null 值允许我们使用唯一索引,但它也搞乱了我们解释记录的方式。
我要说的是,在某些情况下,整数可以发挥更好的作用,因为它不必严格遵循真或假的含义