MySQL 中布尔值的 TINYINT 与 ENUM(0, 1)
MyISAM 表和 MySQL 5.1 中具有 0 和 1 值的 Tinyint 或 ENUM 0,1 哪个更好?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
MyISAM 表和 MySQL 5.1 中具有 0 和 1 值的 Tinyint 或 ENUM 0,1 哪个更好?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
您可以使用 BIT(1) “noreferrer”>mysql 5.1 参考。我不会推荐
enum
或tinyint(1)
因为
bit(1)
只需要 1 位来存储布尔值,而tinyint(1)
需要 8 位。You can use
BIT(1)
as mentioned in mysql 5.1 reference. i will not recommendenum
ortinyint(1)
as
bit(1)
needs only 1 bit for storing boolean value whiletinyint(1)
needs 8 bits.我的研究表明,对于 5.0.3 之前的 MySQL 版本,BIT(1) 是 TINYINT(1) 的同义词。
5.0.3 之后的 MySQL 版本更改了 BIT 数据类型的工作方式。它不再是 TINYINT 的同义词,并且是唯一允许您在小于一个字节的时间内存储任何内容的数据类型。
此数据类型可能比使用 TINYINT 或 ENUM 更好。我计划在我的博客上进行测试,看看哪一个最快以及三个的空间使用情况。如果您想查看大小和速度结果,底部有一个链接。测试平台:运行 OpenBSD 和 MySQL 的消费级 Pentium III 机器。 (使用较慢的数据库开发盒,您可以真正感受到不良代码的影响。此外,测试查询之间的差异更明显。或者,尝试使用分配了足够资源的虚拟机。)
MySQL 官方文档。
Baron Schwartz 对此有这样的说法。
My research shows that BIT(1) is a synonym for TINYINT(1) for versions of MySQL before 5.0.3.
MySQL versions after 5.0.3 change how the BIT datatype works. It is no longer a synonym for TINYINT and is the only data type that allows you to store anything in less than one byte.
This datatype may be preferrable to using TINYINT or ENUM. I plan on testing to see which is fastest and the space usage of the three on my blog. There is a link at the bottom if you care to see the size and speed results. Testbed: crummy consumer grade Pentium III box running OpenBSD and MySQL. (With a slower DB dev box, you can really feel the effects of bad code. Also, differences between test queries are more discernible. Alternatively, try using a VM with barely enough resources allocated.)
The MySQL Official Documentation.
Baron Schwartz has this to say about it.
我建议 ENUM 更好,因为它清楚地表明了预期的内容;如果它以任何可衡量的方式降低性能,我会感到非常惊讶。要让tinyint 完成这项工作,需要检查列上的约束;目前没有任何 MySQL 存储引擎支持这一点。
I'd suggest the ENUM is preferable because it makes clear what is expected; if it detracts from performance in any measurable way I would be very surprised. To make a tinyint do this work would require CHECK a constraint on the column; none of the MySQL storage engines currently support this.
枚举在某种程度上为开发人员或程序员提供了“提示”。但通常情况下,最好以编程方式处理它。
所以无论是ENUM(0,1)、BIT(1)还是TINYINT(1),都使用1个字节,大多数情况下,在客户端处理会更好,而不是在bit(1)中发送2或 enum(0,1) 到服务器,然后服务器将返回一个错误,无论如何你都必须处理该错误 - 使用更多资源(网络 + 服务器 CPU + 客户端 CPU x 2)
0 通常表示 false,
1 真实。
Enum, in a way gives a "hint" for developers or programmers. But usually, it's better to handle it programmatically.
So whether it is ENUM(0,1), BIT(1) AND TINYINT(1), all using 1 byte, it would be better, in most cases, handled on the client side, rather than sending 2 in bit(1) or enum(0,1) to the server and then the server would return an error that you will have to handle anyways - uses more resources (network + server CPU + client CPU x 2)
0 usually means false,
1 true.
为了获得最佳的性能和空间要求,您应该收集布尔值并将它们保存在同一个 TINYINT 中。例如。在 TINYINT 中最多保存 8 个布尔值。 SMALLINT 等中的 16 个布尔值
BIT(1) 和 ENUM 都至少使用 1 个字节
BIT(M) - 大约 (M+7)/8 个字节
请参阅:https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html。因此,如果您要存储 1 个布尔值,我会使用 TINYINT,因为它与 BIT 和 ENUM 具有相同的开销,但如果需要,您可以选择稍后再存储 7 个布尔值。For the best performance and space requirements you should collect your boolean values and save them in the same TINYINT. Eg. Save up to 8 boolean values in a TINYINT. 16 boolean values in a SMALLINT etc.
Both BIT(1) and ENUM uses at least 1 byte
BIT(M) - approximately (M+7)/8 bytes
see: https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html. So if you are storing 1 boolean value I would use TINYINT as it has the same overhead as BIT and ENUM but gives you the option to store 7 more boolean values later if you need.