【发布时间】:2013-01-17 20:06:09
【问题描述】:
我有一个 INT(3) UNSIGNED 列。如果我插入一个字符长度大于 3 的值,它不会剪切该值而是插入它。
发生了什么事?
【问题讨论】:
我有一个 INT(3) UNSIGNED 列。如果我插入一个字符长度大于 3 的值,它不会剪切该值而是插入它。
发生了什么事?
【问题讨论】:
来自What does "size" in int(size) of MySQL mean?
最后,让我们来到手册的地方,那里有 数字含义的最大提示:
一些数据类型描述使用这些约定:
M 表示整数类型的最大显示宽度。为了 浮点和定点类型,M是总位数 可以存储的。对于字符串类型,M 是最大长度。这 M 的最大允许值取决于数据类型。
这与显示宽度有关。不过,奇怪的是,对于 例如,如果您在一个带显示的字段中有 5 位的值 4位宽度,显示宽度不会减少一位。
如果值的位数少于显示宽度,则不会发生任何事情 任何一个。所以看起来显示实际上没有任何效果 生活。
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 不会影响数据的存储方式。它只影响它的显示方式。
【讨论】: