MySQL数据类型

 

DB哥MySQL高级教程-系统学习MySQL共149课时
关注微信公众号免费学:【DB哥】
文末有MySQL高级课程目录

1、MySQL 数据类型

MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

 

1.2、mysql中编码和字符

在 mysql 中,一个中文汉字所占的字节数与编码格式有关:

  • 如果是GBK编码,则一个中文汉字占2个字节,英文占1个字节
  • 如果是UTF8编码,则一个中文汉字占3个字节,而英文字母占1字节。

比如定义某个字段数据类型为:varchar(32),表示这个可以存储 32 个字符,此时表示的是字符,所以跟中英文无关,也就是该字段可以存储 32 个中文,或者是 32 个英文,或者是 32 个中文和英文的混搭都行。但如果字符数超过 32 个的话就会报错。

 

2、数值类型

MySQL 支持所有标准 SQL 数值数据类型,mysql 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)

在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。浮点型有:FLOAT、DOUBLE、DECIMAL。

 

下面的表显示了需要的每个数值类型的存储所占用的字节和可表示的数值范围:

1 bit 即 1位  1字节 = 8 bit  1K = 1024字节  1M = 1024K

类型大小范围(有符号,默认)范围(无符号)用途对应java类
TINYINT 1 Bytes (-128,127) (0,255)

小整数值

一个很小很小的整数

Integer
SMALLINT 2 Bytes (-32 768,32 767) (0,65 535)

大整数值

一个小整数

Integer
MEDIUMINT 3 Bytes (-8 388 608,8 388 607) (0,16 777 215)

大整数值

一个中等大小的整数

Integer
INT或INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295)

大整数值

一个int大小的整数 (大都用来做id)

Integer
BIGINT 8 Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615)

极大整数值

一个蛮大的整数(也常用来做id)

Long
FLOAT 4 Bytes (-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)

单精度,浮点数值。

学生成绩、允许有误差的、单精度浮点数

Float
DOUBLE 8 Bytes (-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)

双精度,浮点数值。

学生成绩、允许有误差的、双精度浮点数

Double
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2

依赖于M和D的值

例如定义 DECIMAL(5,2)  ,则表示最大位数为5位,小数点后2位,于是取值范围为 -999.99至999.99 

依赖于M和D的值

小数值。

用来计算工资、盈利、金融方面

Java.math.BigDecimal

比如 INT 类型,该类型所占字节为 4 个字节。比如数据库中某列的字段类型为 INT,则每条数据的该列的数据都会占服务器容量的 4 个字节的存储容量,并且该列所能显示的数值范围只能是 -128~127 ,或者如果该列是无符号的话,则范围是 0~255。如果你存储超出最大范围则会提示 out of range value ....,比如往 INT 且有符号的数据类型里面存储 2147483648 的值,则会报错并且不会存储成功。

 

2.1、整数类型的长度

常用的整数数据类型有 tinyint ,smallint ,mediumint , int ,bigint 共计5种。

在声明整数类型列时,我们可以跟上一个数值,例如 int(n) ,但实际上这里的 n 跟存储没有什么关系,无论 n 是什么,INT 数据类型都是 4 个字节,只能存储 -2 147 483 648~2 147 483 647(有符号时)范围的数据。

在mysql手册中这个 n 表示最大显示宽度,显示宽度与存储大小和数据类型所能包含的值的范围无关,最大有效的显示宽度是255,即 n 的值最大是 255。

 

比如我声明一个字段为 `number` INT(5) ,此时该 number 字段也是占 4 个字节,也只能存储 -2 147 483 648~2 147 483 647(有符号时)范围的数据。这个 n 的作用只有在我们给列加上 ZEROFILL(用 0 填充)属性时才会体现出来,并且只有在使用一些特定的客户端输出时才会有体现。比如:

  1. `number` int(5) unsigned zerofill -- 加上zerofill属性则必须同时加unsigned属性

此时,当该列某条数据的数字小于 5 位时,在某些特定的客户端检索输出时,会在数字前 “补0”,凑足5位数字。例如存储的数字是123,那么输出00123 。如果大于 5 位则原样显示原数字。

注意,不是在数据库中存储时会自动补 0 ,而是在某一些客户端查询输出时才有显示效果,目前仅发现使用在MySQL Shell才有显示效果,其他客户端连接时均无。

所以说,基本没有开发者会使用这个特性,因为基本没什么用。

 

2.2、浮点型

FLOAT 类型固定占用4个字节, DOUBLE 类型固定占用8个字节,逻辑和上述的整型类似。

DECIMAL 类型的定义方式是 DECIMAL(M,D)  ,其中 M 表示最大位数,D 表示小数点右侧的位数。这里的“位”不是二进制的比特位,而是指十进制的数字的位数。

例如我们定义 DECIMAL(5,2)  ,则表示最大位数为5位,小数点后2位,于是取值范围为 -999.99至999.99 。可以这样理解:M-D 的值为小数点前的位数,D 的值为小数点后的位数,要算取值范围则各个位置填充9,取正负范围。那么容易计算 DECIMAL(5,1)  的取值范围是 -9999.9至9999.9 ;DECIMAL(4,2)  的取值范围是 -99.99至99.99 。

 

DECIMAL(M,D)  的存储方式和其他数字类型都完全不同,它是以字符串形式进行存储的。这可能有点不好理解,以整型 tinyint 为例,它存储的值是直接为十进制到二进制的转换,以无符号型为例,当需要存入的值为100值,将100转化为二进制为1100100 ,使用1个字节即8位记录,实际存入的是 01100100 。但是用 DECIMAL 类型存储时,比如定义 DECIMAL(3,0)  ,存入100时,实际存入的是由字符“1”,“0”,“0”拼接而成的字符串“100”的二进制值,存入时占用3个字节,分别是31,30,30(注意这是十六进制)。
1个数字字符占用1个字节,因此定义为 DECIMAL(M,D)  占用 M 个字节。(同上所述,M个字节为数据本身的占用空间,另外描述该数据的元数据还固定占用2个字节的空间)。
需要注意的是, DECIMAL 类型在存储时有补0操作。小数点前不足,向更高位补0,小数点后不足,向更低位补0。
以 DECIMAL(5,2)  为例,如果准备存入9.5,小数点前应为3位,缺2位,小数点后应为2位,缺1位,各补0后,实际存入 '009.50' ,转化为十六进制为30 30 39 2E 35 30 。但是在检索输出时,小数点前的0一般会省略,而小数点后的0会保留,这一点也需要注意。

 

3、字符串类型

MySQL 提供了 8 个基本的字符串类型,包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。

类型大小用途

对应java类

CHAR 0-255 bytes(字节) 定长字符串 String
VARCHAR 0-65535 bytes 变长字符串 String
TINYTEXT 0-255 bytes 短文本字符串 String
TEXT 0-65 535 bytes 长文本数据 String
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据 String
LONGTEXT 0-4 294 967 295 bytes 极大文本数据 String

 

3.1、字符串类型长度

常用的字符串类型的数据类型有 CHAR 和 VARCHAR 两种,两者后面都必须要跟上一个数字表示长度,例如 CHAR(10)、VARCHAR(10)。

char(n) 和 varchar(n) 括号中的 n 代表最大可容纳的字符的个数,并不代表字节个数。注意,一个中文和一个英文都是 1 个字符,只不过 mysql 的编码格式不同时,1 个中文和 1 个英文所占用的存储字节不同而已。(虽然在早期的版本中,n 指的是字节数,但已经是非常旧的版本了,估计一般人也用不到)

CHAR(n) 和 VARCHAR(n)  都是表示可存储 n 个字符,但是 char 类型在少于 n 个字符时,会在字符串的右边使用空格来填充以达到 n 个字符。

比如:CHAR(4) 和 VARCHAR(4) ,对于 CHAR(4) 表示固定容纳4个字符,当少于4个字符时,会使用空格填充空缺的部分,如果超过4个字符,会自动截断超出部分。例如你存入数据为 'ab' ,实际会存入 'ab  ' (ab后有2个空格)。但是如果我们使用 select 语句来查询 char 类型的字段时,会发现根本就没有自动补空格,这是因为 CHAR 字段在检索输出时,会自动省略右侧的空格。

VARCHAR 是 CHAR 类型的一个变体,它是一种可变长度的字符串类型,并且在声明时也必须要指定字符长度。VARCHAR 类型对于未达到 n 字符的情况不会补空。

CHAR 和 VARCHGAR 不同之处在于 MYSQL 数据库处理这个指示器(即 n)的方式:CHAR 把这个大小视为值的大小,在长度不足的情况下就用空格补足。而 VARCHAR 类型只会把 n 作为限制字符串的最大长度,短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短。

关于计算 VARCHAR 类型字符串的占用空间,有一点需要说明的是, VARCHAR 类型字符串的占用空间实际上包含2部分,一是存储数据本身占用的空间,二是描述数据的元数据占用的空间,例如 VARCHAR 类型会使用1个字节记录存入数据实际的字符数。

比如下面示例说明 varchar 字段的字符长度和占用存储字节数:

(1) 'a啊b' —— 字符数为3,不补空,实际存入为 'a啊b' ,字符数为3,字节数为 1+3+1=5 。

(2)'a啊b哈ccccccccc' —— 字符数超出4,仅保留前4个字符,因此实际存入  'a啊b哈' ,字符数:4,字节数:1+3+1+3=8 。这种情况和 CHAR 类型处理一致。

(3)'a啊和哈' —— 字符数刚好为4,不需要截断和补齐,因此实际存入  'a啊和哈' ,字符数:4,字节数:1+3+3+3=10

 

两者的使用场景:因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。但如果确切知道字符串长度,比如就在50~55之间,那就用 CHAR,因为 CHAR 类型由于本身定长的特性使其性能要高于 VARCHAR。

 

4、日期和时间类型

在处理日期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期(DATE)、时间类型(TIME)、年份(YEAR)、混合日期(DATETIME)、时间类型(TIMESTAMP)。

每一个时间、日期类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。

类型大小
( 固定长度、单位为字节)
范围格式用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD(年月日) 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS(时分秒) 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS(年月日时分秒) 混合日期和时间值
TIMESTAMP 4

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS 混合日期和时间值,时间戳

这个时间的对应的Java类、只要格式正确、都是可以取的,主要看需求是什么。不管你后端是String、Date 类型、只要格式是对应的就是可以的。

 

4.1、DATETIME

DATETIME类型后面可以接后缀,当然也可以没有,如datetime、datetime(3)、datetime(6),这个后缀是用来定义毫秒的精度的。这个后缀最大是6,超过就会报错。

假设建表语句为:

 

则存储结果分别为:

 

5、二进制数据类型

主要包含下列几种数据类型:tityblob,blob,mediumblob,longblob。

 


 

为什么那么多人学MySQL,最后放弃了。因为你走弯路了,没有系统的规划,碎片化的学习,让你对MySQL没有一个整体的认知,而且没有人给你引路指导、纠错,让你很难有进步。

【MySQL课程大纲】备战加薪季,硬核技能来助力!关注我的微信公众号【DB哥】免费学MySQL高级课程

第1章 互联网公司MySQL安装部署

1-1互联网公司安装MySQL规范[09:13]
1-2手把手带你安装MySQL5.7.26[18:20]
1-3手把手带你安装MySQL8.0.20[11:52]
1-4.MySQL多实例的二三事[16:10]

第2章 MySQL启动时遇到的那些坑

2-1生产中的MySQL启动及MySQL启动顺序[17:54]
2-2常见MySQL启动失败案例(1)[22:15]
2-3常见MySQL启动失败案例(2)[21:09]
2-4MySQL数据库用户安全策略[14:44]
2-5找回丢失的用户密码[06:36]

第3章 MySQL数据库乱码之字符集

3-1MySQL字符集[32:27]
3-2插入中文乱码解决[05:54]
3-3数据库常见字符集及如何选择字符集[03:48]
3-4生产中如何彻底避免出现乱码[04:54]

第4章 MySQL用户权限管理

4-1MySQL用户权限管理及注意事项[25:53]
4-2你必须知道的MySQL用户知识[14:10]
4-3MySQL用户权限案例(1)[12:19]
4-4MySQL用户权限案例(2)[20:03]

第5章 SQL编程与性能

5-1SQL编程入门也精彩(1)[26:57]
5-2SQL编程入门也精彩(2)[24:51]
5-3MySQL数据类型与性能(1)[35:42]
5-4MySQL数据类型与性能(2)[21:00]
5-5MySQL约束[32:54]
5-6SQL编程高级之导入测试库及表结构分析[06:56]
5-7SQL编程高级之查询列[14:40]
5-8SQL编程高级之where子句[30:09]
5-9SQL编程高级之group by子句[15:07]
5-10SQL编程高级之order by子句[10:38]
5-11SQL编程高级之limit子句及聚合函数[12:43]
5-12SQL编程高级之多表查询[11:02]
5-13SQL编程高级之子查询[18:56]
5-14SQL编程高级之MySQL巡检案例[13:50]

第6章 MySQL索引性能优化

6-1MySQL索引与二分查找法[38:23]
6-2剖析b+tree数据结构[34:14]
6-3相辅相成的聚集索引和辅助索引[29:08]
6-4覆盖索引与回表查询[13:22]
6-5创建高性能的主键索引[14:57]
6-6唯一索引与普通索引的性能差距[18:06]
6-7前缀索引带来的性能影响[13:04]
6-8你真的会使用联合索引吗[18:50]
6-9Online DDL影响数据库的性能和并发[24:21]
6-10pt-osc原理与应用[22:15]
6-11生产中索引的管理[19:59]
6-12SQL语句无法使用索引的情况[22:10]

第7章 information_schema和sys中索引应用

7-1大有用处的STATISTICS[15:22]
7-2判断索引创建是否合理[13:41]
7-3检查联合索引创建是否合理[09:32]
7-4有了联合索引(a,b),还要创建a索引吗[06:50]
7-5如何查找冗余索引[05:52]
7-6如何查找产生额外排序的sql语句[09:48]
7-7如何查找产生临时表的sql语句[08:36]
7-8全表扫描及统计产生全表扫描的sql语句[08:12]
7-9统计无用的索引[02:33]
7-10索引统计信息管理[07:26]

第8章 MySQL优化器算法与执行计划

8-1简单嵌套查询算法-SNLJ[08:01]
8-2基于索引的嵌套查询算法-INLJ[08:10]
8-3基于块的嵌套查询算法- BNLJ[09:30]
8-4Multi-Range Read算法[06:39]
8-5联表查询算法BKA[05:19]
8-6mysql三层体系结构和ICP索引条件下推[10:49]
8-7一条查询SQL语句是怎样运行的[11:38]
8-8一条更新SQL语句是怎样运行的[05:53]
8-9MySQL长连接与短连接的选择[07:10]
8-10执行计划explain详解[24:20]

第9章 MySQL核心之InnoDB存储引擎

9-1innodb存储引擎体系结构[13:02]
9-2提升数据库性能-缓冲池[34:30]
9-3刷写脏页check point[10:39]
9-4重做日志-redo log[23:39]
9-5回滚日志-undo log[10:04]
9-6.DML语句性能提升技术-插入缓冲[14:44]
9-7数据写入可靠性提升技术-两次写[06:58]
9-8自适应哈希索引-AHI[06:51]
9-9innodb预读预写技术[08:17]
9-10参数配置文件[09:04]
9-11错误日志文件[05:46]
9-12慢查询日志文件[11:42]
9-13MySQL二进制日志(1)[31:28]
9-14MySQL二进制日志(2)[24:57]
9-15表空间文件[12:05]
9-16InnoDB存储引擎表空间结构[17:05]
9-17表碎片清理[14:22]
9-18表空间文件迁移[16:39]

第10章 MySQL查询优化

10-1MySQL查询优化技术[08:34]
10-2子查询优化[11:31]
10-3外连接消除[04:43]
10-4生产中可不可以使用join联表查询[11:41]
10-5group by分组优化[10:16]
10-6order by排序优化[09:02]
10-7MySQL性能抖动问题[04:26]
10-8count(*)优化[08:22]
10-9磁盘性能基准测试[11:11]
10-10MySQL基准测试[07:42]

第11章 事务

11-1认识事务[12:30]
11-2事务控制语句[20:40]
11-3事务的实现方式[13:40]
11-4purge thread线程[06:09]
11-5事务统计QPS与TPS[13:02]
11-6事务隔离级别[28:19]
11-7事务组提交group commit[08:03]
11-8事务两阶段提交[07:51]

第12章 锁优化

12-1认识锁[10:57]
12-2innodb行锁[19:21]
12-3索引对行锁粒度的影响[26:16]
12-4FTWRL全局读锁[06:19]
12-5innodb表锁[12:04]
12-6innodb意向锁与MDL锁[15:45]
12-7自增锁[11:27]
12-8插入意向锁[07:13]
12-9死锁[16:51]
12-10MySQL两阶段锁协议[09:55]

第13章 MVCC多版本并发控制

13-1MVCC多版本并发控制[13:01]

第14章 备份恢复

14-1生产中备份恢复的方式[08:00]
14-2mysqldump备份实战及原理[24:28]
14-3mysqldump全备及binlog恢复数据[13:43]
14-4xtrabackup备份工具安装[04:03]
14-5xtrabackup备份恢复实战及原理[14:08]
14-6binlog备份[10:07]

第15章 MySQL主从复制架构

15-1认识主从复制[11:16]
15-2主从复制架构部署[09:26]
15-3主从复制原理深入讲解[16:29]
15-4从库状态详解[26:21]
15-5过滤复制[18:42]
15-6主从复制案例主库删除[09:31]
15-7主从复制中断解决方案[12:52]
15-8延迟复制[07:40]
15-9主库drop误操作利用延迟复制恢复案例[15:27]
15-10并行复制[15:47]
15-11增强半同步复制[11:11]
15-12主从数据一致性校验[07:35]
15-13gtid复制[13:17]
15-14主从复制架构[10:33]

第16章 MySQL高可用和读写分离架构优化

16-1MHA高可用架构部署[20:39]
16-2主库宕机故障模拟及处理[05:03]
16-3MHA VIP自动切换[09:54]
16-4MHA主从数据自动补足[07:42]
16-5Atlas读写分离高性能架构[15:09]
16-6读写分离架构应用[08:52]
16-7Atlas在线管理[04:18]
16-8读写分离避坑指南[07:11]

第17章 MySQL分库分表优化

17-1MyCAT分布式架构入门及双主架构[11:48]
17-2MyCAT架构部署[20:39]
17-3MyCAT安装[08:39]
17-4MyCAT读写分离架构[13:52]
17-5MyCAT高可用读写分离架构[07:21]
17-6schema.xml配置文件详解[07:07]
17-7MyCAT垂直分表[10:55]
17-8MyCAT水平分表-范围分片[10:18]
17-9MyCAT水平分表-取模分片[06:38]
17-10MyCAT水平分表-枚举分片[08:10]
17-11MyCAT全局表与ER表开始学习

关注我的微信公众号【DB哥】,免费学MySQL高级课程,快学起来吧


posted @ 2023-04-26 09:49  DB哥  阅读(169)  评论(0编辑  收藏  举报