【发布时间】:2010-09-22 08:35:45
【问题描述】:
在什么情况下你会使用哪个?有很大的不同吗?持久化引擎通常使用哪个来存储布尔值?
【问题讨论】:
在什么情况下你会使用哪个?有很大的不同吗?持久化引擎通常使用哪个来存储布尔值?
【问题讨论】:
BIT[(M)]
位域类型。 M 表示 每个值的位数,从 1 到 64. 如果省略 M,则默认为 1。
此数据类型是在 MySQL 中添加的 5.0.3 用于 MyISAM,并在 5.0.5 中扩展到 MEMORY、InnoDB、BDB 和 NDBCLUSTER。在 5.0.3 之前,BIT 是 TINYINT(1) 的同义词。
TINYINT[(M)] [未签名] [ZEROFILL]
一个非常小的整数。有符号范围 是 -128 到 127。无符号范围是 0 到 255。
另外考虑这个;
布尔值,布尔值
这些类型是 微小的(1)。零值是 认为是假的。非零值是 认为是真的。
【讨论】:
boolean 会占用一个字节,即使它真的只是一点点,所以 BIT(1) 在 v5.0.3 之后更好?
BOOL/BOOLEAN 是TINYINT(1) 而不是BIT 的别名。当然,它们最终都占据了一个完整的字节,但语义上BIT 会更合适。
根据我的经验,我告诉您 BIT 在 linux 操作系统类型(例如 Ubuntu)上存在问题。 我在 Windows 上开发了我的数据库,在 linux 上部署了所有内容之后,我遇到了从具有 BIT DATA TYPE 的表中插入或选择的查询的问题。
Bit 目前不安全。 我改为 tinyint(1) 并且工作得很好。我的意思是你只需要一个值来区分它是 1 还是 0 和 tinyint(1) 就可以了
【讨论】:
所有这些理论上的讨论都很棒,但实际上,至少如果您使用 MySQL 并且确实也用于 SQLServer,那么最好为布尔值坚持使用非二进制数据,原因很简单,因为这样更容易工作当你输出数据,查询等等。如果您试图实现 MySQL 和 SQLServer 之间的互操作性(即您在两者之间同步数据),这一点尤其重要,因为两者对 BIT 数据类型的处理是不同的。所以在实践中,如果你坚持使用数字数据类型,你会少很多麻烦。我建议 MySQL 坚持使用存储为 TINYINT(1) 的 BOOL 或 BOOLEAN。即使 MySQL Workbench 和 MySQL Administrator 显示 BIT 数据类型的方式也不好(它是二进制数据的一个小符号)。所以要务实,省去麻烦(不幸的是,我是根据经验说话)。
【讨论】:
BIT 应该只允许 0 和 1(如果字段未定义为 NOT NULL,则为 NULL)。 TINYINT(1) 允许任何可以存储在单个字节中的值,-128..127 或 0..255,具体取决于它是否是无符号的(1 表示您打算只使用单个数字,但它确实不会阻止您存储更大的值)。
对于早于 5.0.3 的版本,BIT 被解释为 TINYINT(1),因此没有没有区别。
BIT 具有“这是一个布尔值”语义,并且某些应用程序会以相同的方式考虑 TINYINT(1)(由于 MySQL 过去处理它的方式),因此应用程序可能会将列格式化为复选框,如果它们检查类型并根据它决定格式。
【讨论】:
TINYINT 是一个 8 位整数值,一个 BIT 字段可以存储 1 位 BIT(1) 和 64 位 BIT(64)。对于布尔值,BIT(1) 很常见。
【讨论】:
可能是错的,但是:
Tinyint 是 0 到 255 之间的整数
位是 1 或 0
因此对我来说比特是布尔值的选择
【讨论】: