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

news2025/7/18 5:48:15

不知道大家第一眼看标题的时候有没有理解,什么是“字段类型长度”,这里我来解释下,就比如我们在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 具体的数据类型

细节数据类型如下:

  • 数值类型
类型大小(Bytes)范围(有符号)范围(无符号)
TINYINT1(-128,127)(0,255)
SMALLINT2(-32 768,32 767)(0,65 535)
MEDIUMINT3(-8 388 608,8 388 607)(0,16 777 215)
INT4(-2 147 483 648,2 147 483 647)(0,4 294 967 295)
BIGINT8(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)
FLOAT4(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)
DOUBLE8(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
DECIMALDECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值
  • 日期和时间类型
类型大小(Bytes)范围格式
DATE31000-01-01/9999-12-31YYYY-MM-DD
TIME3-838:59:59/838:59:59HH:MM:SS
YEAR11901/2155YYYY
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS
TIMESTAMP40/2038结束时间(第2147483647秒)YYYYMMDD HHMMSS
  • 字符串类型
类型大小(Bytes)
CHAR0-255
VARCHAR0-65535
TINYBLOB0-255
TINYTEXT0-255
BLOB0-65 535
TEXT0-65 535
MEDIUMBLOB0-16 777 215
MEDIUMTEXT0-16 777 215
LONGBLOB0-4 294 967 295
LONGTEXT0-4 294 967 295
  • 二进制大对象数据类型 (BLOB)
数据类型语法最大尺寸
TINYBLOB最多可以容纳 255 个字节。
BLOB(size)最多可以容纳 65,535 字节。
MEDIUMBLOB最多可以容纳 16,777,215 字节。
LONGBLOB最多可以容纳 4gb 或 4,294,967,295 字节。
  • 空间数据类型

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

数据类型说明
GEOMETRY它是一个点或点的集合,可以保存具有位置信息的任何类型的空间值。
POINT几何中的一个点代表一个位置。它存储 X、Y 坐标的值。
POLYGON它是一个表示多边几何的平面。它可以由零个或多个内部边界和一个外部边界定义。
LINESTRING它是具有一个或多个点的曲线。如果它只包含两个点,它代表直线。
GEOMETRYCOLLECTION它是一种具有零个或多个几何值的集合。
MULTILINESTRING它是一个多曲线几何体,具有一组线字符串值。
MULTIPOINT它是多个点元素的集合。在这里,这些点不能以任何方式连接或排序。
MULTIPLYGON它是一个多表面对象,表示多个多边形元素的集合。它是一种二维几何。
  • 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约束达到想要的效果
  • 对于字符串类型,指定的宽度要尽可能的贴合业务需要存储数据大小的范围,就可以更加高效的利用存储空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux系统离线安装docker(分步法一键法)

1 前言 在有的项目场景中&#xff0c;服务器是不允许连接外网的。此时若想在服务器上安装部署docker容器&#xff0c;就不能采用在线方式了&#xff0c;不过可以采取离线方式进行安装。下面我们就一起看看离线安装的两种办法。 一种是分步安装法&#xff0c;一种是一键安装法…

Python冷知识:如何找出新版本增加或删除了哪些标准库?

“内置电池”是 Python 最为显著的特性之一&#xff0c;它提供了 200 多个开箱即用的标准库。但是&#xff0c;历经了 30 多年的发展&#xff0c;很多标准库已经成为了不得不舍弃的历史包袱&#xff0c;因为它们正在“漏电”&#xff01; 好消息是&#xff0c;Python 正在进行…

Pinpoint--基础--02--架构设计

Pinpoint–基础–02–架构设计 1、整体架构 1.1、Pinpoint Collector 数据收集模块&#xff0c;接收Agent发送过来的监控数据&#xff0c;并存储到HBase部署在 Web 容器上 1.2、Pinpoint Web 监控展示模块&#xff0c;展示系统调用关系、调用详情、应用状态等&#xff0c;并…

CleanMyMac磁盘空间内存瘦身清理软件使用教程

许多用着Mac系统电脑的朋友们总是卸载不干净电脑垃圾软件&#xff0c;想要把垃圾软件卸载干净&#xff0c;可以尝试使用苹果电脑清理软件CleanMyMac。 经典的电脑深度清理软件——CleanMyMac。由于苹果电脑硬盘售价高昂&#xff0c;且不可以自行安装内存&#xff0c;很多苹果用…

代码随想录day60|结束亦是开始|84.柱状图中最大的矩形|总结

代码随想录day60 来了老弟 84.柱状图中最大的矩形 思路 本题和42. 接雨水是遥相呼应的两道题目&#xff0c;建议都要仔细做一做&#xff0c;原理上有很多相同的地方&#xff0c;但细节上又有差异&#xff0c;更可以加深对单调栈的理解&#xff01;42. 接雨水 其实这两道题目先…

java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp &#xff0c;适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5、手游、端游的 java 游戏服务器…

Intel关NUMA的内存编址

最近在做某国产化平台相关的适配, 不管NUMA的性能和实现方式都和Intel有较大不同, 作为比较对象, 理解Intel的NUMA实现是很有必要的. 虽然从软件角度, 打开NUMA会带来额外的复杂度, 但是从硬件角度, 关闭NUMA其实更复杂, 本文尝试分析关闭NUMA时Intel平台的内存编址. Memory I…

java+springboot基于性别网上学习特征问卷调查及可视化系统

基于JSP技术、SSM框架、B/S机构、Mysql数据库设计并实现了性别网上学习特征及可视化。系统主要包括个人中心、用户管理、调查问卷管理、用户答卷管理、专家建议管理、学习攻略管理、我的收藏管理、爬虫管理、系统管理等功能模块。 (1)绪论 网站的开发背景&#xff0c;意义和系…

栈和队列(带图,有手就废)

文章目录1.栈1.1栈的概念与结构1.2栈的声明1.3动态栈的实现1.3.1初始化栈1.3.2入栈1.3.3出栈1.3.4获取栈顶元素1.3.5获取栈中元素个数1.3.6判断栈是否为空1.3.7销毁栈1.4栈的总结2.队列2.1队列的概念与结构2.2队列的声明2.3队列的实现2.3.1初始化队列2.3.2入队2.3.3出队2.3.4获…

BUUCTF web之WarmUp 源代码详解

目录 前言 PHP代码分析 关于../ 前言 访问除了一张滑稽图&#xff0c;就没其他的了 查看源码&#xff0c;有一个注释了的 source.php&#xff0c;可以尝试直接访问一下。同时进行目录扫描 访问source.php&#xff0c;里面包含php代码&#xff0c;题目说了是php代码审计&…

知识经验分享——YOLOv5-6.0训练出错及解决方法(RuntimeError)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 一、问题bug 二、解决方法 步骤1&#xff1a;打开utils/loss.py文件 步骤2&#xff1a;找到 for i in range(self.nl) 函数&#xff08;CtrlF&#xff09;&#xff0c;作以下替换&#xff1a; 步骤3…

VMware创建Win10操作系统虚拟机

VMware创建Win10操作系统虚拟机1. 安装VMware162. 下载Win10镜像3. 创建虚拟机4. 安装Win105. 安装VMware Tools工具1. 安装VMware16 迅雷云链接&#xff1a;https://pan.xunlei.com/s/VNH9mkbxLqnyB_F_g0h73C_TA1?pwdsdi4# 2. 下载Win10镜像 百度云链接&#xff1a;https:…

优雅的实现符合开闭原则的流水日志抽取demo

如何做出一个标准化记录流水日志(Demo) 昨天晚上 在b站刷到了 极海Channel 海哥的视频 也想去跟着实现一个,作为学习的demo,主要学习思路 可能存在的问题: 可能每一个需要收集的类里取参数的字段可能是不一样的如何去处理如何可以让他更好的作用于新的业务代码上 项目代码日志…

c++STL库

什么是STLSTL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。STL的版本原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本&#xff0c…

阿里首次公开企业级 SpringBoot 实战进阶笔记

Spring Boot 的重要性不需要我多说了吧&#xff0c;Java程序员们应该都懂&#xff0c;不仅面试会被提问&#xff0c;工作中也非常需要spring boot 不知道大家是如何学习Spring Boot的&#xff0c;据我所知&#xff0c;很多开发者会试着在网上找一些开源项目&#xff0c;通过阅…

马上2023了,云原生架构还不懂?阿里云原生架构笔记带你完全拿下

前言 软件架构发展至今&#xff0c;经历了从单体架构、垂直架构、SOA 架构到现在的以微服务、服务网格等云原生技术为主的演变过程&#xff0c;云原生技术发展势不可挡&#xff0c;老生常谈的“云原生”将依然会是未来的热门话题。而且随着数字化转型加速&#xff0c;企业对于…

Spring Data JPA之自动创建数据库表

Spring Data JPA之自动创建数据库表前言Spring Data JPA demo实现步骤导入依赖创建实体类编辑application.yml文件配置数据库连接和jpa配置运行测试总结如果博主的文章对您有所帮助&#xff0c;可以评论、点赞、收藏&#xff0c;支持一下博主!!!前言 由于在项目中使用到了Spri…

C++11中篇

文章目录1. 右值引用和移动语义1.1 左值引用和右值引用1.2 左值引用与右值引用比较1.3 右值引用使用场景和意义1.5 完美转发2. default 和delete1. 右值引用和移动语义 1.1 左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#…

Java_抽象类

目录 1.抽象类语法 2.抽象类特性 3.抽象类的作用 抽象类概念&#xff1a;在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果 一个类中没有包含足够的信息来描绘一个具体的对…

RabbitMQ远程访问

文章目录1. 创建用户2. 关闭防火墙开启端口3. 测试远程访问参考链接背景问题 guest这个用户只能使用localhost登录&#xff0c;而不能使用IP地址登录&#xff1a; amqp://guest:guest127.0.0.1:5672/rabbitVHost 远程无法连接amqp://guest:guest10.10.10.128:5672/rabbitVHost …