文章目录
1 int(N)、tinyint(N)、bigint(N)等数据类型中N的含义
注意:
N只是显示宽度, 不表示存储数字长度的上限。
2 float(M,N)、decimal(M,N)中M、N的含义
注意:
N表示小数的位数,M表示数据的总长度(小数的位数+整数的位数),则整数的位数为M-N。
3 char(N)和varchar(N)中N的含义
首先应该明确char是定长的,而varchar的长度是可变的。
- 因此
char(N)
中的N其实有两层意思:
- (1)表示最大字符长度不允许超过N,不区分中英文。
- (2)即使字符长度小于N,在数据库里也会占N个字符长度。 === 这里要与varchar区别一下,对varchar而言如果字符的实际长度为L,而L小于N的话,在数据库里该字符就只占L个字符长度。
- varchar(N)中的N就是表示最大字符长度不允许超过N,不区分中英文。
4 简单总结+注意事项
- 总结:
int 、tinyint 、bigint等整型数据类型中的N只是显示宽度 — 这个是最特别的,其他数据类型中的M或N都与存储数据的长度有关。
- 注意:
M、N可以限制数据的存储长度,但是每一个数据类型可存储数据的最大长度是固定的,并不是由M、N来指定的。
举个栗子,字符类型可存储数据的最大长度如下:
类型 | 说明 | N的含义 | 是否有字符集 | 最大长度 |
---|---|---|---|---|
CHAR(N) | 定长字符 | 字符 | 是 | 255 |
VARCHAR(N) | 变长字符 | 字符 | 是 | 16384 |
BINARY(N) | 定长二进制字节 | 字节 | 否 | 255 |
VARBINARY(N) | 变长二进制字节 | 字节 | 否 | 16384 |
TINYBLOB(N) | 二进制大对象 | 字节 | 否 | 256 |
BLOB(N) | 二进制大对象 | 字节 | 否 | 16K |
MEDIUMBLOB(N) | 二进制大对象 | 字节 | 否 | 16M |
LONGBLOB(N) | 二进制大对象 | 字节 | 否 | 4G |
TINYTEXT(N) | 大对象 | 字节 | 是 | 256 |
TEXT(N) | 大对象 | 字节 | 是 | 16K |
MEDIUMTEXT(N) | 大对象 | 字节 | 是 | 16M |
LONGTEXT(N) | 大对象 | 字节 | 是 | 4G |
以char而言,它能存储数据的最大长度其实为255个字符,但是为了节省数据库资源,我们往往会结合自己的实际项目,通过N来进一步限制它存储的数据在数据库里具体占的字符大小。
5 int(N)验证
5.1 验证1 —> 大于N长度的数字可以正常插入到数据库
- 建立如下表:
CREATE TABLE `test_int_n` (
`id` int(4)
)
- 插入如下两条数据:
insert into test_int_n values(1);
insert into test_int_n values(123456);
- 可以看到比长度4大的123456也被插入到数据库里了:
5.2 验证2 —> N只是表示显示宽度
5.2.1 使用zerofill关键字进行验证
- 建立如下表:
CREATE TABLE `test_int_n1` (
`id` int(4) zerofill
)
为了比较明显的显示出效果,上面的建表语句加了一个关键字zerofill,该关键字的作用如下:
当存储的数字长度 < N 时,用数字0填充左边,直至补满长度N
- 同样插入如下两条数据:
insert into test_int_n1 values(1);
insert into test_int_n1 values(123456);
- 通过下图就可以看到效果了:
注意:
Navicat可能显示不出来效果,我这里用的是MySQL Workbench,当然用命令行也可以显示出来效果。
5.2.2 使用zerofill关键字时需要注意的一个小坑
这里有一点需要
格外注意
:如果你使用了zerofill关键字mysql会自动给你多加一个unsigned关键字,我们来看一下我创建的test_int_n1表的DDL语句:
插入负数报错效果截图:
同时还要注意,使用了zerofill关键字,虽然对长度小于N的数字进行了填充,但该数字还是该数字,值并未改变,只是显示改变了。验证结果如下: