对于布尔目的列,哪个更好:可为空char(0)
或tinyint(1)
.
我知道 bool 是 tinyint(1) 的别名,但在 O'reilly 出版的“高性能 MySQL”一书中说:
“如果您想在单个存储空间中存储真/假值,另一种选择是创建一个可为空的 CHAR(0) 列。该列能够存储缺少值 (NULL) 或零-length 值(空字符串)。"
哪个更适合大小、性能、索引或...
更新:我发现这个链接对这个问题很有用: Innodb Tables 的 Efficient Boolean value storage
您应该记住,不可能为 CHAR(0) 列建立索引,即使作为复合索引的一部分也是如此。
就大小而言,没有什么比 NULLable CHAR(0); 但是你有多少?与表中的其他数据类型相比?通常,与整体数据类型和大小相比,这是可以忽略的。
最清楚的是 BOOL/TINYINT UNSIGNED。最明显的是期望的值。
否则,请在我的帖子中考虑许多替代方案,并请参阅评论中的好主意:选择 MySQL 布尔数据类型
我认为您应该使用 TINYINT(1),因为对于整数值,您可以将值降至 0 和 1。使用 TINYINT,我们只需支付 1 字节的存储空间。与 CHAR(1) 一样,我们不能阻止任何人插入 0 和 1 以外的其他值。但这并不重要,如果我们愿意接受 0 评估为 False,而所有其他值都评估为 True。使用 TINYINT(1),布尔表达式可以很好地处理您的列值。
大小、性能和索引:
我觉得检索和排序整数字段比字符字段更快,并且为开/关标志显示 1 和 0 也很熟悉。