我有一个 INT(3) UNSIGNED 列。如果我插入一个字符长度大于 3 的值,它不会剪切该值而是插入它。
发生了什么?
FROM MySQL 的 int(size) 中的“size”是什么意思?
最后,让我们来到手册中最能说明数字含义的地方:
一些数据类型描述使用这些约定:
M 表示整数类型的最大显示宽度。对于浮点和定点类型,M 是可以存储的总位数。对于字符串类型,M 是最大长度。M 的最大允许值取决于数据类型。
这与显示宽度有关。不过,奇怪的是,例如,如果您在一个显示宽度为 4 位的字段中的值为 5 位,则显示宽度不会减少一个数字。
如果该值的位数少于显示宽度,则也不会发生任何事情。所以看起来显示在现实生活中没有任何影响。
Now2 ZEROFILL 开始发挥作用。这是一个简洁的功能,可以用零填充(在这里)小于指定显示宽度的值,这样您将始终收到指定长度的值。例如,这对于发票 ID 很有用。
因此,得出结论:大小既不是位也不是字节。它只是显示宽度,当字段指定了 ZEROFILL 时使用。
mysql> create table a ( a tinyint );
Query OK, 0 rows affected (0.29 sec)
mysql> show columns from a;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| a | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.26 sec)
mysql> alter table a change a a tinyint(1);
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into a values (100);
Query OK, 1 row affected (0.00 sec)
mysql> select * from a;
+-----+
| a |
+-----+
| 100 |
+-----+
1 row in set (0.00 sec)
2 Some code to better explain what I described so clumsily.
mysql> create table b ( b int (4));
Query OK, 0 rows affected (0.25 sec)
mysql> insert into b values (10000);
Query OK, 1 row affected (0.00 sec)
mysql> select * from b;
+-------+
| b |
+-------+
| 10000 |
+-------+
1 row in set (0.00 sec)
mysql> alter table b change b b int(11);
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from b;
+-------+
| b |
+-------+
| 10000 |
+-------+
1 row in set (0.00 sec)
mysql> alter table b change b b int(11) zerofill;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from b;
+-------------+
| b |
+-------------+
| 00000010000 |
+-------------+
1 row in set (0.00 sec)
mysql> alter table b change b b int(4) zerofill;
Query OK, 1 row affected (0.08 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from b;
+-------+
| b |
+-------+
| 10000 |
+-------+
1 row in set (0.00 sec)
mysql> alter table b change b b int(6) zerofill;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from b;
+--------+
| b |
+--------+
| 010000 |
+--------+
1 row in set (0.00 sec)
实际上3
有一个显示宽度适用于ZEROFILL
右侧的零填充。它不限制整数的容量,因为它4294967295
从零开始存储。
例子,
CREATE TABLE tableName
(
x INT(3) ZEROFILL NOT NULL,
y INT NOT NULL
);
INSERT INTO tableName (x,y) VALUES
(1, 1),
(12, 12);
SELECT x, y FROM tableName;
结果:
x y
001 1
012 12
使用 display width
对数据的存储方式没有影响。它只影响它的显示方式。