【问题标题】:BOOLEAN or TINYINT confusionBOOLEAN 或 TINYINT 混淆
【发布时间】:2012-06-25 10:29:12
【问题描述】:

我正在为一个需要使用布尔日期类型来存储两种状态(真或假)的网站设计数据库。我正在使用 MySQL。
在使用 phpMyAdmin 设计数据库时,我发现我同时拥有 BOOLEAN 数据类型和 TINYINT 数据类型。
我浏览了不同的文章,有人说 TINYINT 与 BOOLEAN 相同,没有区别。有人说 BOOLEAN 在 MySQL 中被转换为 TINYINT。

我的问题是,如果它们都相同,为什么存在两个?应该只有其中一个。

这里是我读到的文章的参考:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

【问题讨论】:

    标签: mysql types boolean tinyint


    【解决方案1】:

    MySQL 没有内部布尔数据类型。它使用最小的整数数据类型 - TINYINT。

    BOOLEAN 和 BOOL 等同于 TINYINT(1),因为它们是同义词。

    尝试创建这个表 -

    CREATE TABLE table1 (
      column1 BOOLEAN DEFAULT NULL
    );
    

    然后运行 ​​SHOW CREATE TABLE,你会得到这个输出 -

    CREATE TABLE `table1` (
      `column1` tinyint(1) DEFAULT NULL
    )
    

    【讨论】:

    • 但是你的答案在所有其他方面都是正确的。似乎使 OP 感到困惑的是同义词的存在。
    • 似乎是为了向后兼容而做的。 BOOLEAN 数据类型在 MySQL 5 之前是未优化的 BIT 类型,它也是 TINYINT。来自文档 - 为 5.1 计划的新功能:优化 BIT 类型以占用一位。 (BIT 现在占用一个字节;它被视为 TINYINT 的同义词。)。
    • 是的,你可以知道有BIT(1)BIT(17)甚至BIT(64)
    • @Devart -- 您的答案得票最多并且出现在第一位(无论如何都在我的列表中)并且已经过去了一段时间,您是否愿意在答案中添加一些讨论MySQL 5.1 及更高版本上的 BIT 类型?
    • @Jonathan 也许提到它很有价值,但是 BIT(1) 实际上并没有比 TINYINT(1) 使用更少的空间,并且在使用标准 mysql 控制台时不会像大多数人所期望的那样显示。由于这个缺点,并且没有存储优势,在我的经验中,仅使用 TINYINT(1) 或 BOOLEAN 似乎是最常见的。
    【解决方案2】:

    最新的 MySQL 版本具有新的 BIT 数据类型,您可以在其中指定字段中的位数,例如 BIT(1) 用作 Boolean 类型,因为它只能是 01.

    【讨论】:

      【解决方案3】:

      截至MySql 5.1版本reference

      BIT(M) =  approximately (M+7)/8 bytes, 
      BIT(1) =  (1+7)/8 = 1 bytes (8 bits)
      

      ================================================ ============================

      TINYINT(1) take 8 bits.
      

      https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric

      【讨论】:

      • 您的参考资料说所需的存储空间实际上是“大约 (M+7)/8 字节”。即,它向上舍入到下一个完整字节。因此它确实占用 1 位。
      【解决方案4】:

      只是给 php 开发人员的注意事项(我缺少必要的 stackoverflow 点来将其作为评论发布)... 到 TINYINT 的自动(和静默)转换意味着 php 从“BOOLEAN”列中检索一个值作为“ 0”或“1”,而不是(我)预期的真/假。

      开发人员正在查看用于创建表的 SQL 并看到如下内容: “some_boolean BOOLEAN NOT NULL DEFAULT FALSE”可能合理地期望在检索包含该列的行时看到真/假结果。相反(至少在我的 PHP 版本中),结果将是“0”或“1”(是的,字符串“0”或字符串“1”,而不是 int 0/1,谢谢 php)。

      这是一个 nit,但足以导致单元测试失败。

      【讨论】:

      • 作为附加说明,PHP 的 mysql 驱动程序将所有整数类型作为字符串拉入。
      【解决方案5】:

      MySQL 的数值类型概述: 布尔值,布尔值: 这些类型是 TINYINT(1) 的同义词。零值被认为是错误的。非零值被认为是真的。

      请看这里: https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

      【讨论】:

        猜你喜欢
        • 2020-02-03
        • 2011-05-23
        • 2019-10-17
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 2013-11-19
        • 1970-01-01
        相关资源
        最近更新 更多