我们在定义数字类型的数据类型的时候,往往考虑该数字类型的数据能否装的下该字段的最大值,如状态位的字段:tinyint,表的主键:int,或者bigint,今天在看到开发同学提交表结构设计文档中看到数值类型的字段定义为int(255),int(20),int(2)当时一下还没有反映过来,我们知道在mysql中数字类型用定长字节存储:
Column Type | Bytes On Disk |
tinyint | 1 bytes |
smallint | 2 bytes |
mediumint | 3 bytes |
int | 4 bytes |
bigint | 8 bytes |
估计他们这样定义是想为了存储更多范围的数据;
那这个int[M]中M是什么意义喃,在定义数值型数据类型的时候,可以在关键字括号内指定整数值(如:int(M),M的最大值为255)显示最大显示宽度,显示宽度M与数据所占用空间,数值的范围无关。 如果在定义字段的时候指定zerofill,那么当数值的显示宽度小于指定的列宽度时候,则默认补充的空格用0代替。
Zerofill: root@test 10:24:26>create table int_12(id int(12) zerofill);
Query OK, 0 rows affected (0.11 sec)
root@test 10:28:07>insert into int_12 values(1);
Query OK, 1 row affected (0.00 sec)
root@test 10:28:18>select * from int_12;
+————–+
| id |
+————–+
| 000000000001 |
+————–+
1 row in set (0.00 sec)
Nozerofill:
root@test 11:13:31>desc int_12_no;
+——-+———+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———+——+—–+———+——-+
| id | int(12) | YES | | NULL | |
root@test 11:14:16>insert into int_12_no values(1);
Query OK, 1 row affected (0.00 sec)
root@test 11:14:32>select * from int_12_no;
+——+
| id |
+——+
| 1 |
+——+
1 row in set (0.00 sec)
存储结构:
root@test 11:14:38>select id,hex(id) from int_12_no;
+——+———+
| id | hex(id) |
+——+———+
| 1 | 1 |
+——+———+
1 row in set (0.00 sec)
root@test 11:15:17>select id,hex(id) from int_12;
+————–+———+
| id | hex(id) |
+————–+———+
| 000000000001 | 1 |
+————–+———+
1 row in set (0.00 sec)
可以看到通过hex函数导出内部的存储结构是一样的,所以占用的空间大小是相同的;
数值范围:
root@test 11:17:42>create table test_4(id int(4) zerofill);
Query OK, 0 rows affected (0.12 sec)
root@test 11:18:17>insert into test_4 values(12345);
Query OK, 1 row affected (0.00 sec)
root@test 11:18:29>select * from test_4;
+——-+
| id |
+——-+
| 12345 |
+——-+
1 row in set (0.00 sec)
可以看到,当数值的范围超过指定显示范围后,并没有出现截断的情况。