2

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

4

2 回答 2

2

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)但现在改变它为时已晚。

于 2022-02-04T15:20:02.850 回答
0

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

于 2022-02-24T14:00:58.153 回答