【MySQL笔记】数字类型、时间和日期类型、字符串类型

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 在数据库中,经常需要存储一些数字,适合用数字类型来保存。数字类型包括整数类型、浮点数类型、定点数类型、BIT(位)类型。

image.gif



🙋‍ 哈喽大家好,本次是MySQL数据库原理系列第六期

⭐本期是MySQL的数据类型

🏆系列专栏:MySQL数据库

😄笔者还是前端的菜鸟,还请大家多多指教呀~

👍欢迎大佬指正,一起学习,一起加油!


前言


使用MySQL数据库存储数据时,不同的数据类型决定了MySQL存储数据方式的不同。MySQL数据库提供了多种数据类型,其中包括数字类型、时间和日期类型、字符串类型。本期我们一起来学习MySQL的数据类型吧~


🍎数字类型


在数据库中,经常需要存储一些数字,适合用数字类型来保存。数字类型包括整数类型、浮点数类型、定点数类型、BIT(位)类型。


🍒整数类型


MySQL中的整数类型用于保存整数,根据取值范围的不同,可以分为五种,分别是TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。


数据类型 字节数 无符号数的取值范围 有符号数的取值范围
TINYINT 1 0~255 -128~127
SMALLINT 2 0~65535 -32768~32767
MEDIUMINT 3 0~16777215 -8388608~8388607
INT 4 0~4294967295 -2147483648~2147483647
BIGINT 8 0~18446744073709551615 -9223372036854775808~9223372036854775807


不同整数类型所占用的字节数和取值范围都是不同的。其中,占用字节数最小的是TIMYINT,占用字节数最大的是BIGINT。


不同整数类型的取值范围也可以根据字节数计算出来。例如,TINYINT类型的整数占用1字节,1字节是8位,所以TINYINT类型无符号数的最大值为2^8-1(即255),有符号数的最大值就是2 ^7-1(即127)。


注意:若使用无符号数据类型,需要在数据类型右边加上UNSIGNED关键字来修饰


如下,我们创建一个my_int表,选取int和tinyint两种类型测试。其中int_1和int_3是有符号类型,int_2和int_4是无符号类型。通过插入数据来看,当插入的数据超出取值范围时,会报错。


91a63ceb4c9642438caa3b3a68600ba5.png


查看my_int表的结构,我们会发现数据类型的右边有一个小括号,这是显示宽度。默认情况下,显示宽度是取值范围所能表示的最大宽度。对于有符号类型,符号也占用一个宽度。


注意:显示宽度与取值范围无关,若数值的位数小于显示宽度,会填充空格,若大于显示宽度,则不影响显示结果。

f88b3d6e471c4c59bc149d8728656905.png


为字段设置零填充(ZEROFILL)


为字段设置零填充时,如果数值宽度小于显示宽度,会在左侧填充0。👇


cc77e6d6d40f4cbeb7074577fb25c9ed.png


设置零填充后,字段自动设为无符号类型,这是因为负数不能使用零填充


这里我们插入数据会发现,当数值超过显示宽度时,不填充零;当数值未达到显示宽度时,则在左侧填充0。


67b9991b778447339946c42514a58cfb.png


🍒浮点数类型


在MySQL中,存储的小数都是使用浮点数或定点数来表示的。浮点数分为单精度浮点数类型(float)和双精度浮点数类型(double)。


数据类型 字节数 负数的取值范围 非负数的取值范围
FLOAT 4 -3.402823466E+38~-1.175494351E-38 0和1.175494351E-38~3.402823466E+38
DOUBLE 8 -1.7976931348623157E+308~-2.2250738585072014E-308 0和2.2250738585072014E-308~1.7976931348623157E+308


表中列举的取值范围是理论上的极限值,根据不同的硬件或操作系统,实际取值范围可能会小。


当浮点数类型使用unsigned修饰为无符号时,取值范围将不包括负数。


注意:float的精度为6位或7位,double的精度大约为15位。如果超出精度,可能会导致给定的数值与实际保存的数值不一致,发生精度损失。


ca854969d4184054a75be1a91a82f0bb.png


66ad5c59175e49f7bcb9b3a2d12ca4b1.png


🍒定点数类型


定点数类型通过decimal(M,D)设置位数和精度


M:数字总位数,不包括“.”和“-”,最大值为65,默认值为10

D:小数点后的位数,最大值为30,默认值为0


系统会自动根据存储的数据来分配存储空间,如果不允许保存负数,则通过UNSIGNED修饰。


下面我们来看一个案例👇


创建表进行测试,在表中插入数值。我们会发现,当插入的小数部分超出范围时,会四舍五入,当插入的小数部分四舍五入导致整数部分进位时,会插入失败。


注意:out of range value错误是超出取值范围


58507cd6407341339ac0937900a77670.png

e8f1fc8f94ad475d934f6ccb1b5476fe.png


🍒BIT类型


BIT类型用于存储二进制数据,语法为BIT(M),M表示位数,范围为1~64。


下面以保存A字符为例👇


00aa0c003e934e23a890a7cc4f479fac.png

b3d762a6687041a1bc11658c2cf5a24f.png

3f1f7168fa13442c98d05ef1bdbf0c7c.png

ee55e67a76524716af71462687f7f5c4.png


注意:MySQL中的直接常量是指在MySQL中直接编写的字面常量,常用在insert语句中编写插入的数据,包括:十进制数、二进制数、十六进制数、字符串。


🍒如何选择数据类型


  1. 如果一个数据将来可能参与数学计算,推荐使用整数、浮点数、定点数类型。如果只用来显示,则推荐使用字符串类型。
  2. 表的主键推荐使用整数类型。
  3. 当插入的值的数据类型与字段的数据类型不一致,可以使用alter table修改字段的数据类型。
  4. 对于小数类型的设置,推荐使用定点数据类型并设置合理的范围,可以使计算更为准确。


🍎时间和日期类型


数据类型 取值范围 日期格式 零值
YEAR 1901~2155 YYYY 0000
DATE 1000-01-01~9999-12-3 YYYY-MM-DD 0000-00-00
TIME -838:59:59~838:59:59 HH:MM:SS 00:00:00
DATETIME 1000-01-01 00:00:00~9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 0000-00-00 00:00:00
TIMESTAMP 1970-01-01 00:00:01~2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 0000-00-00 00:00:00


YYYY表示年,MM表示月,DD表示日。每种日期和时间类型的取值范围都是不同的。如果插入的数值不合法,系统会自动将对应的零值插入数据库中。


🍒YEAR类型


YEAR类型用于表示年份,有三种格式可以指定YEAR类型的值👇


1、使用四位字符串或数字表示,为’1901’~‘2155’或1901 ~ 2155。例如:输入’2022’或2022,插入到数据库中的值均为2022。


2、使用两位字符串表示为'00'~'99',其中’00’~'69’的值会被转换为2000 ~2069的YEAR值,‘70’ ~ '99’的值会被转换为1970 ~ 1999的YEAR的值。


3、使用两位数字表示为1 ~ 99,其中1~6’的值会被转换为2001 ~2069的YEAR值,70 ~ 99的值会被转换为1970 ~ 1999的YEAR的值。


注意:当使用YEAR类型时,一定要区分’0’和0。因为字符串格式的’0’表示YEAR值是2000,而数字格式的0表示的YEAR值是0000。


6de02b4b4eed47619fe1e89e8d2d4668.png


🍒DATE类型


DATE类型用于表示日期值,不包含时间部分,可以使用以下4种格式指定DATE类型的值👇


1、以'YYYY-MM-DD'或者'YYYYMMDD'字符串格式表示。


2、以'YY-MM-DD'或者'YYMMDD'字符串格式表示。YY表示年,为’00’~‘99’。其中’00’ ~'69’的值会被转换为2000 ~2069的YEAR值,‘70’ ~ '99’的值会被转换为1970 ~ 1999的YEAR的值。


3、以YY-MM-DD或者YYMMDD数字格式表示。


4、使用current_date或者now()输入当前系统日期。


🍒TIME类型


TIME类型表示时间值,显示形式一般为HH:MM:SS。其中,HH表示小时,MM表示分钟,SS表示秒。可以用以下3种格式指定TIME类型的值👇


1、以'HHMMSS'或者HHMMSS数字格式表示。


2、以'D HH:MM:SS'字符串格式表示。其中,D表示日,可以取0 ~34之间的值,插入数据时,小时的值等于(D*24 + HH)。


3、使用current_time或者now()输入当前系统时间。


🍒DATETIME类型


DATETIME类型表示日期和时间,显示形式一般为’YYYY-MM-DD HH:MM:SS’。其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分钟,SS表示秒。可以用以下4种格式指定DATETIME类型的值👇


1、以'YYYY-MM-DD HH:MM:SS或者'YYYYMMDDSSHHMMSS'字符串格式表示的日期和时间,取值范围为’1000-01-01 00:00:00’~‘9999-12-31 23:59:59’。


2、以'YY-MM-DD HH:MM:SS'或者'YYMMDDSSHHMMSS'字符串格式表示的日期和时间。


3、以YYYYMMDDSSHHMMSS或者YYMMDDSSHHMMSS数字格式表示的日期和时间。


4、使用now()来输入当前系统的日期和时间。


🍒TIMESTAMP类型


TIMESTAMP(时间戳)类型用于表示日期和时间,显示形式与DATETIME相同,但取值范围比DATETIME小。


1、使用CURRENT_TIMESTAMP来输入系统当前日期和时间。


2、无任何输入,或输入NULL时,实际上保存的是系统当前日期和时间。


🍎字符串类型


数据类型 类型说明
CHAR 固定长度字符串
VARCHAR 可变长度字符串
TEXT 大文本数据
ENUM 枚举类型
SET 字符串类型
BINARY 固定长度的二进制数据
VARBINARY 可变长度的二进制数据
BLOB 二进制大对象(Binary Large Object)


🍒CHAR和VARCHAR类型


CHAR和VARCHAR类型都用来保存字符串数据。不同的是,VARCHAR可以存储可变长度的字符串。


对于CHAR(M)和VARCHAR(M)来说,CHAR(M)无论插入值的长度是多少,所占用的存储空间都是M字节,而VARCHAR(M)占用的字节数为实际长度加1。


CHAR和VARCHAR类型在插入数据时,如果字符串末尾有空格,CHAR会自动去掉空格然后保存,VARCHAR类型会保留空格。


🍒TEXT类型


TEXT类型用于保存大文本数据,例如文章内容、评论等比较长的文本,有四种类型。


数据类型 存储范围
TINYTEXT 0~ 2^8-1字节
TEXT 0~2^16-1字节
MEDIUMTEXT 0~2^24-1字节
LONGTEXT 0~2^32-1字节


TEXT类型所能保存的最大字符数量取决于字符串实际占用的字节数。


🍒ENUM类型


ENUM类型又称为枚举类型,定义ENUM类型方式如下所示:


ENUM(‘值1’,‘值2’,‘值3’,…,‘值n’)


在MySQL中,枚举列表最多可以有65535个值,每个值都有一个顺序编号,实际保存在记录中的是顺序编号,而不是列表的值,因此不必担心过长的值占用空间。但在SELECT、INSERT等语句进行操作时,仍然使用列表中的值。


9b96808302104d1abd63a24d0be3a614.png

fa691919c8eb4864bf0a90546ab5ab82.png


🍒SET类型


SET类型用于保存字符串对象,定义格式与ENUM类型类似。


SET(‘值1’,‘值2’,‘值3’,…,‘值n’)


SET类型的列表中最多可以有64个值,且列表中的每个值都有一个顺序编号,为了节省空间,实际保存在记录中的也是顺序编号,但在SELECT、INSERT等语句进行操作时,仍然使用列表中的值。


SET和ENUM的区别:SET可以从列表中选择一个或多个值来保存,多个值之间用逗号“,”分隔。


SET和ENUM相似之处


1、ENUM类似单选框,SET类似复选框。


2、ENUM和SET类型的优势在于规范数据本身,限定只能插入规定的数据项,节省了存储空间,查询速度比CHAR和VARCHAR快。


3、ENUM和SET类型列表中的值都可以使用中文,但必须设置支持中文的字符集。


4、ENUM和SET 类型在填写列表、插入值、查找值等操作时,都会自动忽略末尾的空格。


🍒BINARY和VARBINARY类型


BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是,它们所表示的是二进制数据。定义方式如下👇


BINARY(M)

VARBINARY(M)


其中,M指的是二进制数据的最大字节长度。BINARY类型的长度是固定的,如果数据的长度不足最大长度,将在数据的后面用“\0”补齐,最终达到指定长度。


注意:在查询BINARY类型时,查询条件字符串需要加上“\0”填充符,否则查询不到该记录


🍒BLOB类型


BLOB类型用于保存数据量很大的二进制数据,如图片、PDF文档等。BLOB有四种类型,如下👇


数据类型 存储范围
TINYBLOB 0~ 2^8-1字节
BLOB 0~2^16-1字节
MEDIUMBLOB 0~2^24-1字节
LONGBLOB 0~2^32-1字节


注意:BLOB类型和TEXT类型很相似,但BLOB类型数据是根据二进制编码进行比较和排序,而TEXT类型数据是根据文本模式进行比较和排序。


BLOB查询时区分大小写


🍒JSON数据类型


MySQL从5.7.8版本开始提供了JSON数据类型。JSON是一种轻量级的数据交换格式,有JavaScript语言发展而来,其本质是一个字符串。MySQL中JSON类型值常见的表现方式有JSON数组和JSON对象。


JSON数组: [“abc”,10,null,true,false]


JSON对象: {“k1”:‘value’,“k2”:10}


总结


以上就是今天的学习内容啦~

如果有兴趣的话可以订阅专栏,持续更新呢~

咱们下期再见~


30bba3e3c88247f593132215a18df304.gif

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
SQL 存储 关系型数据库
|
3天前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
15 4
|
3天前
|
关系型数据库 MySQL 数据库
【MySQL实战笔记】 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-01
【4月更文挑战第17天】MySQL的锁分为全局锁、表级锁和行锁。全局锁用于全库备份,可能导致业务暂停或主从延迟。不加锁备份会导致逻辑不一致。推荐使用`FTWRL`而非`readonly=true`因后者可能影响其他逻辑且异常处理不同。表级锁如`lock tables`限制读写并限定操作对象,常用于并发控制。元数据锁(MDL)在访问表时自动加锁,确保读写正确性。
70 31
|
2天前
|
SQL 存储 关系型数据库
Mysql优化提高笔记整理,来自于一位鹅厂大佬的笔记,阿里P7亲自教你
Mysql优化提高笔记整理,来自于一位鹅厂大佬的笔记,阿里P7亲自教你
|
3天前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】分库分表
分库分表是一种数据库架构设计的方法,用于解决大规模数据存储和处理的问题。 分库分表可以简单理解为原来一个表存储数据现在改为通过多个数据库及多个表去存储,这就相当于原来一台服务器提供服务现在改成多台服务器组成集群共同提供服务。
28 8
|
3天前
|
存储 关系型数据库 MySQL
9.2.5.2 【MySQL】XDES 类型
9.2.5.2 【MySQL】XDES 类型
13 0
9.2.5.2 【MySQL】XDES 类型
|
3天前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
3天前
|
存储 SQL 关系型数据库
MySQL万字超详细笔记❗❗❗
MySQL万字超详细笔记❗❗❗
77 1
MySQL万字超详细笔记❗❗❗
|
3天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
3天前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】MySQL总结
MySQL 是一种关系型数据库,说到关系,那么就离不开表与表之间的关系,而最能体现这种关系的其实就是我们接下来需要介绍的主角 SQL,SQL 的全称是 Structure Query Language ,结构化的查询语言,它是一种针对表关联关系所设计的一门语言,也就是说,学好 MySQL,SQL 是基础和重中之重。SQL 不只是 MySQL 中特有的一门语言,大多数关系型数据库都支持这门语言。
240 8

推荐镜像

更多