【问题标题】:MySql - Which column type to use for storing multiple booleans in multiple columns?MySql - 使用哪种列类型在多列中存储多个布尔值?
【发布时间】:2020-09-10 21:14:25
【问题描述】:

我想在一个表中保存多个布尔值。我想使用多列而不是一个 Bit(N) 列。现在我正在考虑是否应该使用 Bool = tinyint(1) 或 bit(1) 列。 我从一个类似的问题中读到了这个较旧的answer 并想知道是否

但如果您有更多真/假列,我建议您使用位,因为位列的每个值都放置在相同的 1 个字节中,直到它被填充。

是真的。有人可以证实这一点吗?对于这种情况,我应该在 2020 年使用哪种列类型?

谢谢, 问候

【问题讨论】:

  • 你问是因为你担心他们会使用多少空间?
  • 没那么担心。我只是想有理由使用 bit 而不是 bool ,反之亦然。我找不到答案。
  • 你确定每个但是应该是一个单独的列,而不是一个单独的行?
  • 想要保存,比如说用户状态和类型,然后 concat 和 conv 来获取 bitflags。
  • 如果你使用 hibernate/JPA 布尔值通常会是一个 int(1),我想他们更清楚

标签: mysql sql database boolean multiple-columns


【解决方案1】:

本机BOOLEAN 类型旨在用于存储布尔值。是的,显然BOOLEAN 占用了一个字节而不是一个位(BIT(1) 实际上可能并非只使用一位空间;请参阅下面的注释)。但这不会对您的数据库占用多少空间产生明显的影响。考虑一下这一点,如果您在一个表中有 10 个布尔值并且最终有 100 万条记录,那么布尔值仅占用 10MB 的空间,而如果您使用一点,则占用 1.25MB 的空间。即使您获得 1 亿条记录,也只有 1GB 的空间。如果您有 1 亿条记录,那么您将拥有足够的空间,1GB 无关紧要。

这里有一些关于BOOLEAN、TINYINT 和BIT 的注释,可能有助于阐明您为什么要使用BOOLEAN:

  1. BOOLEAN 旨在用于存储布尔值。您可以将实现细节交给 Mysql 开发人员。
  2. BOOLEAN 带有语义含义;它清楚地表明该列的预期用途是存储布尔值。
  3. 原来BIT(1)实际上也占用了1个字节。来自the documentation:

BIT(M) 大约需要 (M+7)/8 个字节

所以BIT(1) 需要(1+7)/8 bytes 或1 byte。

  1. 您可能会读到,因为BOOLEAN 是TINYINT 的同义词,您可以将TRUE 和FALSE 以外的值存储在BOOLEAN 中(例如,您可以存储22) .但是,如果您尝试插入例如22 到BOOLEAN 列中,Mysql 会将其解释为TRUE(它会将0 解释为FALSE)。因此,您无需担心奇怪的值会进入您的 BOOLEAN 列。有关示例,请参阅此 SQL fiddle。

【讨论】:

  • 这回答了相反的问题
  • @Strawberry 怎么样?
  • op 应该使用哪种数据类型?如果标准不是记忆,那是什么?
【解决方案2】:

您还可以使用 VARCHAR 数据类型来存储位(N),它首先会占用您存储的空间,例如“0101000”,这意味着您有 7 个布尔值。第 2 个和第 4 个将是 TRUE,其他将是 FALSE,这将在您的存储中使用 7+1 个字节 (CMIIW)

干杯:)

【讨论】:

  • 为什么要使用VARCHAR 而不是BIT 来存储位值?
  • 'storagewise' 如果您只需要 8 列布尔值,则更好地使用位是的,它只会使用 1 个字节(CMIIW)。如果您只需要 TRUE/FALSE,我可能更喜欢使用 tinyint(1) 或 char(1),我猜只是为了“超越”数据库与编码(更好或只是偏好)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2015-10-12
相关资源
最近更新 更多