【问题标题】:What is the difference between BIT and TINYINT in MySQL?MySQL 中的 BIT 和 TINYINT 有什么区别?
【发布时间】:2010-09-22 08:35:45
【问题描述】:

在什么情况下你会使用哪个?有很大的不同吗?持久化引擎通常使用哪个来存储布尔值?

【问题讨论】:

    标签: mysql bit tinyint


    【解决方案1】:

    来自Overview of Numeric Types

    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 之后更好?
    • 是的@Pacerier。布尔值只是数字字段的丑陋别名。
    • 就实际存储而言,BIT(1) 仍然占用最少一个字节。 BIT(M) = (M+7)/8 字节。 (1+7)/8 = 1 个字节。见Numeric Type Storage Requirements
    • 很遗憾BOOL/BOOLEANTINYINT(1) 而不是BIT 的别名。当然,它们最终都占据了一个完整的字节,但语义上BIT 会更合适。
    【解决方案2】:

    根据我的经验,我告诉您 BIT 在 linux 操作系统类型(例如 Ubuntu)上存在问题。 我在 Windows 上开发了我的数据库,在 linux 上部署了所有内容之后,我遇到了从具有 BIT DATA TYPE 的表中插入或选择的查询的问题。

    Bit 目前不安全。 我改为 tinyint(1) 并且工作得很好。我的意思是你只需要一个值来区分它是 1 还是 0 和 tinyint(1) 就可以了

    【讨论】:

      【解决方案3】:

      所有这些理论上的讨论都很棒,但实际上,至少如果您使用 MySQL 并且确实也用于 SQLServer,那么最好为布尔值坚持使用非二进制数据,原因很简单,因为这样更容易工作当你输出数据,查询等等。如果您试图实现 MySQL 和 SQLServer 之间的互操作性(即您在两者之间同步数据),这一点尤其重要,因为两者对 BIT 数据类型的处理是不同的。所以在实践中,如果你坚持使用数字数据类型,你会少很多麻烦。我建议 MySQL 坚持使用存储为 TINYINT(1) 的 BOOL 或 BOOLEAN。即使 MySQL Workbench 和 MySQL Administrator 显示 BIT 数据类型的方式也不好(它是二进制数据的一个小符号)。所以要务实,省去麻烦(不幸的是,我是根据经验说话)。

      【讨论】:

      • 在我看来,某些接口等确实错误地解释了正确的二进制数据并不是我的错。如果管理员(包括我自己)抱怨某个符号(指 MySQL Wrokbench),那么这就是将我的正确(二进制)数据误解为没有提供有关内容信息的符号的人的错。所以 MySQL/Oracle 犯了错误,我不愿意仅仅因为有人犯了错误而改变我的编程概念。
      【解决方案4】:

      BIT 应该只允许 0 和 1(如果字段未定义为 NOT NULL,则为 NULL)。 TINYINT(1) 允许任何可以存储在单个字节中的值,-128..127 或 0..255,具体取决于它是否是无符号的(1 表示您打算只使用单个数字,但它确实不会阻止您存储更大的值)。

      对于早于 5.0.3 的版本,BIT 被解释为 TINYINT(1),因此没有没有区别。

      BIT 具有“这是一个布尔值”语义,并且某些应用程序会以相同的方式考虑 TINYINT(1)(由于 MySQL 过去处理它的方式),因此应用程序可能会将列格式化为复选框,如果它们检查类型并根据它决定格式。

      【讨论】:

        【解决方案5】:

        TINYINT 是一个 8 位整数值,一个 BIT 字段可以存储 1 位 BIT(1) 和 64 位 BIT(64)。对于布尔值,BIT(1) 很常见。

        【讨论】:

        • TINYINT 和 BIT(8) 有什么区别?
        • TINYINT 可以有符号或无符号并与负数相关。 Bit 只存储位而不签名数据,您可以自己解释 MSB。
        • 为避免混淆,应添加 TINYINT 和 BIT(1) 的 Storage Requirements 没有区别,BOOL 和 BOOLEAN 是 TINYINT(1) Numeric Type Overview 的同义词。
        【解决方案6】:

        可能是错的,但是:

        Tinyint 是 0 到 255 之间的整数

        位是 1 或 0

        因此对我来说比特是布尔值的选择

        【讨论】:

        • 抱歉,我们在这里使用的是 T_SQL,所以我不知道
        猜你喜欢
        • 2013-01-18
        • 2011-02-28
        • 2015-07-11
        • 2012-10-02
        • 2013-03-14
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 2014-08-03
        相关资源
        最近更新 更多