【mysql知识点整理】--- int(N),char(N)、varchar(N),decimal(M,N)中的N、M是什么意思???


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的数字进行了填充,但该数字还是该数字,值并未改变,只是显示改变了。验证结果如下:
在这里插入图片描述

发布了200 篇原创文章 · 获赞 218 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/nrsc272420199/article/details/104283363