MySQL 中 tinyint(M) 的用途是什么?

What is the utility of tinyint(M) in MySQL?

这更像是一个学术问题。在 MySQL 数据库中,我知道 tinyint(M) 及其与 tinyint(1) 的区别已经在该论坛上进行了讨论,但我想知道其他事情。列“REVIEWED TINYINT(5) 是否可以用于在前端表单中存储 5 个不同的布尔复选框的值?我正在考虑将其视为一个数组。如果是这样,将如何引用它们?会有什么东西吗?像 REVIEWED(3) 或 REVIEWED[3] 一样用于引用它们的元素?是否有语法来检查它们的所有元素是否为 1 或 0(或空)?

TINYINT(1) 和 TINYINT(5) 和 TINYINT(12) 或任何其他长度实际上存储完全相同。它们都是一个 8 位有符号整数。它们支持从 -128 到 127 的整数值。如果列定义为无符号整数,则支持从 0 到 255 的值。

那么“长度”参数是怎么回事?没有什么。它不影响整数的大小、位数或值的范围。该参数仅是 显示提示。除非你使用 ZEROFILL 选项,否则它是没有用的。

mysql> create table mytable (i1 tinyint(1) zerofill, i2 tinyint(5) zerofill, i3 tinyint(12) zerofill);
Query OK, 0 rows affected (0.04 sec)
    
mysql> insert into mytable values (255,255,255);
Query OK, 1 row affected (0.02 sec)

mysql> select * from mytable;
+------+-------+--------------+
| i1   | i2    | i3           |
+------+-------+--------------+
|  255 | 00255 | 000000000255 |
+------+-------+--------------+

ZEROFILL 选项强制列无符号,当您查询该列时,它会用零填充结果,直到您为该列定义的长度。零不存储在数据库中,它们仅在您获取查询结果时添加。

整数的“长度”参数具有误导性,会给 MySQL 用户带来很多困惑。事后看来,将语法设为 TINYINT ZEROFILL(12) 会更好,但现在更改它为时已晚。

自从发布这个问题后,我意识到字段不能被视为数组,当我的布尔值一直被转换为 tinyint(1) 时,1 不是元素的数量,而是最大值(正如 Bill Karwin 指出的那样,它实际上只是一个显示提示),这是有道理的,因为布尔值要么是 0 要么是 1。应该没有理由需要数组,因为可以简单地创建额外的字段。正如我所说,这是一个学术问题。 Bill 启发了我很多,我想从这个问题继续。