写点什么

一文搞懂 MySQL 表字段类型长度的含义

作者:Barry Yan
  • 2022-11-19
    北京
  • 本文字数:1772 字

    阅读完需:约 6 分钟

一文搞懂MySQL表字段类型长度的含义

不知道大家第一眼看标题的时候有没有理解,什么是“字段类型长度”,这里我来解释下,就比如我们在 MySQL 建表的时候,比如下面这个建表语句:


CREATE TABLE `user` (  `id` int(10) DEFAULT NULL,  `name` varchar(50) DEFAULT NULL,  `age` int(1) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8
复制代码


其中 id、name、age 是该表的三个不同字段,而每个类型+数字就是该字段的类型长度,比如 int(10)就是该字段是 int 类型长度为 10,这下大家应该能理解什么是 MySQL 表字段类型长度了吧(其实在后续的讲解中会发现这个并不是长度,而是宽度)


那么重点问题来了,每一种类型后面括号里的数字都有什么含义呢,下面我们来剖析下:


首先 MySQL 表的字段都支持哪些类型?

1 MySQL 支持的数据类型

1.1 类型分类

分为几个大类:


1.2 具体的数据类型

细节数据类型如下:


  • 数值类型



  • 日期和时间类型



  • 字符串类型



  • 二进制大对象数据类型 (BLOB)



  • 空间数据类型


它是一种特殊的数据类型,用于保存各种几何和地理值。



  • JSON 数据类型


MySQL 从 5.7.8 版本开始提供 JSON 数据类型的支持,与之前将 JSON 数据以字符串形式存储在列中相比,JSON 数据类型增加了以下支持:


(1)它提供了 JSON 文档的自动验证。


(2)它提供了对于 JSON 的最佳存储格式。


(3)提供了相关操作 JSON 类型数据的函数

1.3 数据类型说明

MySQL 的数据类型长度是固定的,而不是由建表时指定的,unsigned表示无符号类型


CREATE TABLE `table01` (  `id` int(11) DEFAULT NULL,  `name` varchar(255) DEFAULT NULL,  `num` int(10) unsigned DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8
复制代码


当插入负数时就会报错


INSERT into table01 VALUE(1,'zs',-10)
ERROR 1264 (22003): Out of range value for column 'num' at row 1
复制代码


插入数据超过最大长度时也会报错


INSERT into table01 VALUE(2,'ls',1000000000000)
ERROR 1264 (22003): Out of range value for column 'num' at row 1
复制代码

2 建表时指定的长度概念

2.1 对于数值类型

我们大家都喜欢在建表时指定类型的大小,但是这个大小并不是数据类型的大小,而是宽度,这个数字无论是大是小占用的存储都是一样的,无论是 int 类型还是 varchar 类型,我们看一个例子:


CREATE TABLE `table03` (  `num1` int(10) DEFAULT NULL,  `num2` int(10) unsigned zerofill DEFAULT NULL,  `num3` int(5) unsigned zerofill DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8
复制代码


插入数据


insert into table03 value(1,1,1)insert into table03 value(11111,11111,11111)insert into table03 value(111111,111111,111111)insert into table03 value(12345678901,12345678901,12345678901)
复制代码


结果:



解释下 zerofill:zerofill默认为int(10),当使用zerofill 时,默认会自动加unsigned(无符号)属性,插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0

2.2 对于字符串类型

我们来试下:


CREATE TABLE `table04` (  `str1` varchar(10) DEFAULT NULL,  `str2` varchar(1) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8
复制代码


插入数据:


insert into table04 value('a','a');insert into table04 value('abc','abc');
复制代码


报错:


mysql> insert into table04 value('abc','abc');ERROR 1406 (22001): Data too long for column 'str2' at row 1
复制代码


结果:



解释下 varchar 类型指定宽度的作用:


  • VARCHAR(N),N 表示的是字符数不是字节数,比如 VARCHAR(255),可以最大可存储 255 个汉字,需要根据实际的宽度来选择 N,MySQL 一个表中所有的 VARCHAR 字段最大长度是 65535 个字节,进行排序和创建临时表一类的内存操作时,会使用 N 的长度申请内存

  • VARCHAR(N),如果 N<256 时会使用一个字节来存储长度,如果 N>=256 则使用两个字节来存储长度

3 结论

MySQL 建表语法再次说明:


create table 表名(     字段名1 类型[(宽度) 约束条件],    字段名2 类型[(宽度) 约束条件],     ......);
复制代码


对某些值的宽度短于该列宽度的值进行左填补显示的,而不是为了限制在该列中存储值的宽度,也不是为了限制那些超过该列指定宽度的值的可被显示的数字位数,因此我们得出一下结论:


  • 对于数值类型,可以不指定宽度,使用默认长度即可,如需指定宽度可配合 unsigned、zerofill 约束达到想要的效果

  • 对于字符串类型,指定的宽度要尽可能的贴合业务需要存储数据大小的范围,就可以更加高效的利用存储空间

发布于: 2022-11-19阅读数: 17
用户头像

Barry Yan

关注

做兴趣使然的Hero 2021-01-14 加入

Just do it.

评论

发布
暂无评论
一文搞懂MySQL表字段类型长度的含义_MySQL_Barry Yan_InfoQ写作社区