【问题标题】:True/False vs 0/1 in MySQL真/假与 MySQL 中的 0/1
【发布时间】:2012-06-06 19:35:27
【问题描述】:

在 MySQL 数据库中哪个更快?布尔值,还是使用零和一来表示布尔值?我的前端只有一个是/否单选按钮。

【问题讨论】:

  • 在将 MySQL 与 MySqlDataReader for C#.NET 一起使用时,我有一个相关的观察结果。当我创建一个 BOOLEAN 类型的列时,它以 TINYINT(1) 结尾,并且值在 PHPMyAdmin 中看起来像 0 和 1。但是,当使用 MySqlDataReader 以编程方式选择时,返回的值是字符串“True”和“False”,(完全大写)。这恰好适用于 C#.NET 的 bool.Parse(),它只接受字符串“True”和“False”。我猜 MySqlDataReader 是为了方便而特意构建的。
  • 请注意,MySql 现在有一个BIT 类型。请参阅this answer 了解更多信息。
  • 您使用的是/否单选按钮?!?复选框/复选框有什么问题?

标签: mysql boolean


【解决方案1】:

启用“使用布尔值”选项的某些“前端”会将所有 TINYINT(1) 列视为布尔值,反之亦然。

这允许您在应用程序中使用 TRUE 和 FALSE 而不是 1 和 0。

这根本不会影响数据库,因为它是在应用程序中实现的。

在 MySQL 中并没有真正的 BOOLEAN 类型。 BOOLEAN 只是 TINYINT(1) 的同义词,TRUE 和 FALSE 是 1 和 0 的同义词。

如果在编译器中完成转换,应用程序的性能不会有任何差异。否则,差异仍然不会很明显。

您应该使用可以让您更有效地编码的任何方法,尽管不使用该功能可能会减少对特定“前端”供应商的依赖。

【讨论】:

  • 这并不完全正确。 TRUEFALSE 不一定等同于 10。一方面,当与IS 运算符结合使用时,它们的行为非常不同。例如,WHERE NOT(something IS 1) 将是语法错误,但 WHERE NOT(something IS TRUE) 有效。
  • @MattZukowski、TRUEFALSE10 的同义词,但反之则不然。 0 不是FALSE 的同义词,1 不是TRUE 的同义词,这就是为什么TRUE IS 1 会给出语法错误,而1 IS TRUE 不会。
  • @MarcusAdams “同义词”是错误的词; “别名”更好
【解决方案2】:

在 MySQL 中,TRUE and FALSETINYINT(1)同义词

因此它基本上是一样的,但 MySQL 正在转换为 0/1 - 所以如果这对你来说更容易,请使用 TINYINT

附言
性能可能非常微不足道(如果有的话),如果您需要在 StackOverflow 上询问,那么它不会影响您的数据库:)

【讨论】:

    【解决方案3】:

    Bit 如果您不喜欢 tinyint 也是一个选项。几个链接:

    毫不奇怪,有关数字类型的更多信息可在in the manual 获得。

    另一个链接:http://blog.mclaughlinsoftware.com/2010/02/26/mysql-boolean-data-type/

    以及上面文章评论部分的引述:

    • TINYINT(1) 不是 bit(1) 的同义词。
    • TINYINT(1) 可以存储 -9 到 9。
    • TINYINT(1) 无符号:0-9
    • BIT(1): 0, 1。(位,字面意思)。

    编辑:此编辑(和答案)仅与原始问题远程相关...

    Justin Rovang 和作者 maclochlainn 的其他引用(链接文章的评论部分)。

    对不起,我似乎已经成为 substr-ism 的受害者: 小灵通(1):-128-+127 TINYINT(1) 无符号:0-255 (Justin Rovang 2011 年 8 月 25 日下午 4:32)

    确实如此,但这篇文章是关于 PHPMyAdmin 列为布尔值的,它只使用了 256 种可能性中的 0 或 1。 (maclochlainn 2011 年 8 月 25 日晚上 11:35)

    【讨论】:

    • 你错了; TINYINT(1) 可以存储更多不同的值; (1) 限制仅影响这些值的显示方式。
    • @cnst 查看编辑。整个答案与原始问题完全无关,但至少它提供了有关该主题的一些信息。顺便说一句:简单的select * from table_x 会显示tinyint(1) 列的整个值,即使它是两位或三位数字。
    【解决方案4】:

    如果您对性能感兴趣,那么值得使用 ENUM 类型。由于更好的索引性能,它在大表上可能会更快。

    使用方法(来源:http://dev.mysql.com/doc/refman/5.5/en/enum.html):

    CREATE TABLE shirts (
        name VARCHAR(40),
        size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
    );
    

    但是,我总是这样解释查询:

    EXPLAIN SELECT * FROM shirts WHERE size='medium';
    

    将告诉您有关查询的大量信息,并帮助您构建更好的表结构。 为此,让 phpmyadmin 提出一个 table 表结构是有用的——但这更多是长时间优化的可能性,当 table 已经填满了很多数据时。

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 2016-06-12
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2015-07-09
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多