《MySQL数据库基础》4. 数据类型

💡Yupureki:个人主页

✨个人专栏:《C++》 《算法》《Linux系统编程》《高并发内存池》《MySQL数据库》


🌸Yupureki🌸的简介:


目录

[1. 数据类型分类](#1. 数据类型分类)

[2. 数值类型](#2. 数值类型)

[2.1 int类型](#2.1 int类型)

[2.2 bit类型](#2.2 bit类型)

[2.3 浮点数类型](#2.3 浮点数类型)

[2.3.1 float类型](#2.3.1 float类型)

[2.3.2 decimal类型](#2.3.2 decimal类型)

[3. 字符串类型](#3. 字符串类型)

[3.1 char类型](#3.1 char类型)

[3.2 varchar类型](#3.2 varchar类型)

[4. 日期和时间类型](#4. 日期和时间类型)

[5. enum和set](#5. enum和set)


1. 数据类型分类

MySQL中有许多的数据类型,这些类型有很多我们的"老朋友",如整型,浮点数,字符串等

2. 数值类型

用于存储整数、小数和浮点数,支持算术运算。

类型 字节数 范围(有符号) 作用/特点
TINYINT 1 -128 ~ 127 极小整数,如年龄、状态码
SMALLINT 2 -32768 ~ 32767 小整数,如人口数量、小范围计数器
MEDIUMINT 3 -8388608 ~ 8388607 中等整数,如中等规模的ID
INT 4 -2147483648 ~ 2147483647 标准整数,最常用,如主键、常规ID
BIGINT 8 -2^63 ~ 2^63-1 大整数,如超大表的主键、天文数字
FLOAT 4 约 ±3.4028E+38 单精度浮点数,适合科学计算,有精度误差
DOUBLE 8 约 ±1.7977E+308 双精度浮点数,精度更高,也存在误差
DECIMAL 变长 取决于精度和小数位数 定点数,精确存储,适合金额、财务数据
BIT 1~8 1 ~ 64 位二进制 位字段类型,存储二进制标志

2.1 int类型

类型 字节数 范围(有符号) 作用/特点
TINYINT 1 -128 ~ 127 极小整数,如年龄、状态码
SMALLINT 2 -32768 ~ 32767 小整数,如人口数量、小范围计数器
MEDIUMINT 3 -8388608 ~ 8388607 中等整数,如中等规模的ID
INT 4 -2147483648 ~ 2147483647 标准整数,最常用,如主键、常规ID
BIGINT 8 -2^63 ~ 2^63-1 大整数,如超大表的主键、天文数字

tinyint测试范围边界:

说明:

在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的

无符号案例:

2.2 bit类型

| 类型 | 字节数 | 范围(无符号) | 作用/特点 |

BIT 1~8 1 ~ 64 位二进制 位字段类型,存储二进制标志

语法:

bit [(M)] : 位字段类型。 M 表示有几个比特位,范围从 1 到 64 。如果 M 被忽略,默认为 1 。

2.3 浮点数类型

| 类型 | 字节数 | 范围(有符号) | 作用/特点 |
| FLOAT | 4 | 约 ±3.4028E+38 | 单精度浮点数,适合科学计算,有精度误差 |
| DOUBLE | 8 | 约 ±1.7977E+308 | 双精度浮点数,精度更高,也存在误差 |

DECIMAL 变长 取决于精度和小数位数 定点数,精确存储,适合金额、财务数据

2.3.1 float类型

语法:

float [(m, d)] [ unsigned ] : m 指定显示长度, d 指定小数位数,占用空间 4 个字节

如:float(4,2)表示的范围是-99.99~99.99,MySQL在保存值时会进行四舍五入。

边界:

四舍五入:

99.991->99.99

99.995->100.00,因此会报错

无符号:
如果定义的是 float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99

2.3.2 decimal类型

语法:

decimal (m, d) [ unsigned ] : 定点数 m 指定长度, d 表示小数点的位数

decimal(5,2)表示的范围是-999.99~999.99

decimal(5,2)unsigned表示的范围0~999.99

decimal和float很像,但是有区别:
float和decimal表示的精度不一样

说明:float表示的精度大约是7位。

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,

默认是10。

因此如果希望小数的精度高,推荐使用decimal。

3. 字符串类型

类型 最大长度 作用/特点
CHAR 255 字符 定长字符串,存储时右补空格,适合长度固定的数据,如性别
VARCHAR 65535 字节(受字符集影响) 变长字符串,节省空间,适合长度可变的数据,如姓名、地址
BINARY 255 字节 定长二进制数据,类似 CHAR,但存储字节,适合加密散列值
VARBINARY 65535 字节 变长二进制数据,适合图片、文件的原始字节
TINYBLOB 255 字节 极小二进制大对象,适合小图片、小文件
BLOB 65535 字节(64KB) 二进制大对象,适合中等大小文件
MEDIUMBLOB 16777215 字节(16MB) 中等二进制对象
LONGBLOB 4GB 极大二进制对象
TINYTEXT 255 字符 极短文本
TEXT 65535 字符 长文本,适合文章内容、评论
MEDIUMTEXT 16777215 字符 中等长度文本
LONGTEXT 4GB 字符 极长文本,适合存储大段文字

这么多类型,眼睛都花了。没事,其实常用的就两种:

| 类型 | 最大长度 | 作用/特点 |
| CHAR | 255 字符 | 定长字符串,存储时右补空格,适合长度固定的数据,如性别 |

VARCHAR 65535 字节(受字符集影响) 变长字符串,节省空间,适合长度可变的数据,如姓名、地址

3.1 char类型

语法:

char (L): 固定长度字符串, L 是可以存储的长度,单位为字符,最大长度值可以为 255

说明:char(2)表示可以存放两个字符,可以是字母或汉字。但是char大小最大只能是255

3.2 varchar类型

语法:

varchar (L): 可变长度字符串, L 表示字符长度,最大长度 65535 个字节

说明:

char(6)表示内存中开辟了6个字节的大小

而varchar(6)只表明最大的字节数是6,并不直接开6个字节的大小,而是你用多少开多少。比如你只需要3个字节,那么他就只会开3个字节,这样节省了空间

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

  • ·varchar长度可以指定为0到65535之间的值,但是有1-3个字节用于记录数据大小,所以说有效字节数是65532。
  • ·当我门的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

4. 日期和时间类型

用于存储日期、时间或时间戳,支持日期函数运算。

类型 格式 范围 作用/特点
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-31 存储日期,如生日、入职日期
TIME HH:MM:SS -838:59:59 ~ 838:59:59 存储时间或时间间隔,如营业时间
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 存储日期和时间,不受时区影响
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC 时间戳,受时区影响,自动更新(可配置)
YEAR YYYY 1901 ~ 2155 存储年份,如车辆生产年份

其中时间戳timestamp可自动配置,设置其default默认值等于当前时间即可

5. enum和set

类型 最大长度 作用/特点
ENUM 65535 个成员 枚举类型,从预定义列表中选择一个值,节省空间
SET 64 个成员 集合类型,可从预定义列表中选择多个值,用逗号分隔

语法:

  • enum:枚举,"单选"类型;
  • enum('选项1','选项2,'选项3...);

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,3..最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

  • set:集合,"多选"类型;部
  • set('选项值1','选项值2','选项值3',..);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字1,2,4,8,16,32,..

set中可以选一个或多个,而enum只能选一个

相关推荐
重庆小透明2 小时前
【java基础内容】ConcurrentHashmap源码万字解析
java·开发语言
C++ 老炮儿的技术栈2 小时前
C++、C#常用语法对比
c语言·开发语言·c++·qt·c#·visual studio
共享家95272 小时前
Java入门(继承)
java·开发语言
Bert.Cai2 小时前
Python默认参数详解
开发语言·python
码农多耕地呗2 小时前
本地-导表导错数据库,导致数据库数据混乱问题
数据库·mysql
_饭团2 小时前
指针核心知识:5篇系统梳理4
c语言·开发语言·c++·笔记·深度学习·算法·面试
AuroBreeze2 小时前
RISC-V: Minimal U-mode implementation
linux·c语言·c++·risc-v
0xDevNull2 小时前
Java 高频面试题
java·开发语言
Ronin3052 小时前
【Qt常用控件】多元素控件
开发语言·qt·常用控件·多元素控件