协慌网

登录 贡献 社区

哪个 MySQL 数据类型用于存储布尔值

由于 MySQL 似乎没有任何 “布尔” 数据类型,你滥用 '哪种数据类型' 来存储 MySQL 中的真 / 假信息?

特别是在写入和读取 PHP 脚本的上下文中。

随着时间的推移,我使用并看到了几种方法:

  • tinyint,包含值 0/1 的 varchar 字段,
  • 包含字符串 '0'/'1' 或'true'/'false' 的 varchar 字段
  • 最后枚举包含两个选项'true'/'false' 的字段。

以上都不是最佳的。我更倾向于使用 tinyint 0/1 变体,因为 PHP 中的自动类型转换非常简单地给出了布尔值。

那你使用哪种数据类型?有没有为布尔值设计的类型,我忽略了?您是否看到使用某种类型的优点 / 缺点?

答案

对于 MySQL 5.0.3 及更高版本,您可以使用BIT 。手册说:

从 MySQL 5.0.3 开始,BIT 数据类型用于存储位字段值。一种 BIT(M)允许存储 M 位值。 M 的范围为 1 到 64。

否则,根据 MySQL 手册,你可以使用 bool 和 boolean,它们是tinyint (1)的别名:

Bool,Boolean:这些类型是TINYINT (1)的同义词。值为零被视为 false。非零值被认为是真实的。

MySQL 还声明:

我们打算在未来的 MySQL 版本中按照标准 SQL 实现完整的布尔类型处理。

参考文献: http//dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

BOOLBOOLEANTINYINT(1)同义词。零是false ,其他任何事都是true 。更多信息在这里

这是一个优雅的解决方案,我非常欣赏,因为它使用零数据字节:

some_flag CHAR(0) DEFAULT NULL

要将其设置为 true,请设置some_flag = ''并将其设置为 false,设置some_flag = NULL

然后测试 true,检查 some_flag 是否为非IS NOT NULL ,并测试 false,检查 some_flag 是否为IS NULL

(这种方法在 Jon Warren Lentz,Baron Schwartz 和 Arjen Lentz 的 “High Performance MySQL:Optimization,Backups,Replication,and More” 中有描述。)