ChatGPT解决这个技术问题 Extra ChatGPT

MySql:Tinyint (2) 与 tinyint(1) - 有什么区别?

我知道 mysql 中的布尔值是 tinyint (1)

今天我看到一个表定义了一个像 tinyint(2) 这样的整数,还有其他像 int(4)int(6) ...

大小在 integer 和 tinyint 类型的字段中意味着什么?

了解 MySQL 整数数据类型 here
@AamirR 的答案是正确的
@evilReiko zerofill 对值的存储方式也没有影响,它实际上是关于表示......空格或零并没有真正影响任何人答案的正确性imo

J
Ja͢ck

(m) 表示列显示宽度; MySQL 客户端等应用程序在显示查询结果时会使用此功能。

例如:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

这里 abc 分别使用 TINYINT(1)TINYINT(2)TINYINT(3)。如您所见,它使用显示宽度填充左侧的值。

请务必注意,它不会影响该特定类型的可接受值范围,即 TINYINT(1) 仍然接受 [-128 .. 127]


“列宽”是什么意思?
@realtebo 它主要由 mysql 命令行客户端用于显示目的。
界面显示的“位数”数。换句话说,它将在左侧填充零。这种特性在数据库的早期是有意义的,但现在它只是遗留下来的。
@Kailas 如果您不使用 mysql 客户端?一个都没有。
@Kailas 不! tinyint(1) 不只接受 0-9。它接受 tinyint 可以容纳的所有内容。
A
AamirR

表示显示宽度

无论您使用 tinyint(1) 还是 tinyint(2),都没有任何区别。

我总是使用 tinyint(1) 和 int(11),我使用了几个 mysql 客户端(navicat,sequel pro)。

这根本没有任何意义!我跑了一个测试,上面所有的客户端甚至命令行客户端似乎都忽略了这一点。

但是,如果您使用 ZEROFILL 选项,显示宽度 是最重要的,例如您的表格有以下 2 列:

一个 tinyint(2) 零填充

tinyint(4) 零填充

两列的值均为 1,A 列的输出将是 01B 的输出将是 0001,如下面的屏幕截图所示:)

https://i.stack.imgur.com/L68G2.png


奇怪的是,我刚刚发现在 C# 官方 MySQL 连接器中 tinyint(1) 永远不会返回不同于 0 和 1 的值。这可能与 tinyint(1) 自动被识别为布尔值有关。只是提醒一下,有时很重要。
使用尽可能小的整数类型和长度不是更好吗?我的印象是这在 MySQL 中节省了内存。
正如@Daniel-Sharp 指出的那样,它似乎对连接器很重要。刚刚使用 JDBC 报告 Hibernate 出现问题,它将 TINYINT(1) 解释为 BIT。
@DanielSharp 这可能是由于连接选项 tinyInt1isBit 默认为 true。请参阅dev.mysql.com/doc/connector-j/8.0/en/…
我一直认为这与接受的数字数量有关(例如,int(4) 不允许任何高于 9999 的数字)。我想我那时总是想错了。在 PHP 和 MySQL 命令行中,我都可以看到上面的值。
z
zloctb
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)

请编辑您的答案以包括一些解释。仅代码的答案对教育未来的 SO 读者几乎没有作用。您的答案因质量低劣而在审核队列中。
D
Devart

关于INT、TINYINT……这些是不同的数据类型,INT是4字节数,TINYINT是1字节数。更多信息在这里 - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT

TINYINT 数据类型的语法是 TINYINT(M),其中 M 表示最大显示宽度(仅在您的 MySQL 客户端支持时使用)。

Numeric Type Attributes


“显示宽度”是什么意思!?
来自参考 - 例如,INT(4) 指定显示宽度为四位的 INT。应用程序可以使用此可选显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格向左填充它们。
但我还没有看到使用此功能的应用程序或 MySQL 客户端。我总是使用 INT(11) 并使用格式化函数来自定义输出。