✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨
✨ 个人主页:余辉zmh--CSDN博客
✨ 文章所属专栏:MySQL篇--CSDN博客

文章目录
数据类型
1.数据类型分类
| 分类 | 数据类型 | 说明 | 
|---|---|---|
| 数值类型 | BIT(M) | 
位类型。M指定位数,默认值1,范围1-64 | 
TINYINT [UNSIGNED] | 
带符号的范围-128~127,无符号范围0~255,默认有符号 | 
|
| BOOL | 使用0和1表示真和假 | |
| SMALLINT [UNSIGNED] | 带符号范围-2^15~2^15-1,无符号范围0~2^16-1 | 
|
INT [UNSIGNED] | 
带符号范围-2<^31~2^31-1,无符号范围0~2^32-1 | 
|
| BIGINT [UNSIGNED] | 带符号范围-2^63~2^63-1,无符号范围0~2^64-1 | 
|
FLOAT[(M,D)] [UNSIGNED] | 
M指定显示长度,D指定小数位数,占用4字节 | |
| DOUBLE[(M,D)] [UNSIGNED] | 表示比float精度更大的小数,占用空间8字节 | |
DECIMAL(M,D) [UNSIGNED] | 
定点数M指定长度,D表示小数点的位数 | |
| 文本、二进制类型 | CHAR(size) | 
固定长度字符串,最大255 | 
VARCHAR(size) | 
可变长度字符串,最大长度65535 | |
| BLOB | 二进制数据 | |
| TEXT | 大文本,不支持全文索引,不支持默认值 | |
| 时间日期 | DATE/DATETIME/TIMESTAMP | 
日期类型(yyyy-mm-dd),(yyyy-mm-dd hh:mm:ss),timestamp时间戳 | 
| String类型 | ENUM类型 | 
字符串对象,值来自表创建时在列规定中显示枚举的一个列值 | 
SET类型 | 
字符串对象,可包含零或多个允许值,多个值用逗号分隔(值中不能包含逗号) | 
接下来会讲解几个常用类型的使用:
2.数值类型
int整形类型
1.TINYINT
            
            
              sql
              
              
            
          
          TINYINT          -- 有符号:-128 到 127
TINYINT UNSIGNED -- 无符号:0 到 255
        - 存储空间大小:1字节;
 - 常见用途:布尔值,状态标志,年龄等小数值;
 - 示例:
 
            
            
              sql
              
              
            
          
           create table users(
    id int,
    age tinyint,
    status tinyint
);
        不管是有符号还是无符号的,插入的数值必须在要求范围中才能插入成功 ,否则就会插入失败

后面的几个整型类型也是如此,就不演示了。
2.SMALLINT
            
            
              sql
              
              
            
          
          SMALLINT          -- 有符号:-32,768 到 32,767
SMALLINT UNSIGNED -- 无符号:0 到 65,535
        - 存储空间大小:2字节;
 - 常见用途:年份,端口号,小计数值等;
 
3.INT
            
            
              sql
              
              
            
          
          INT               -- 有符号:-2,147,483,648 到 2,147,483,647
INT UNSIGNED      -- 无符号:0 到 4,294,967,295
        - 存储空间大小:4字节;
 - 常见用途:主键,用户ID,计数器等;
 
4.BIGINT
            
            
              mysql
              
              
            
          
          BIGINT            -- 有符号:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
BIGINT UNSIGNED   -- 无符号:0 到 18,446,744,073,709,551,615
        - 存储空间大小:8字节;
 - 常见用途:大数值,时间戳,大数据场景等;
 
注意:
- 尽量不要使用
 unsigned无符号,对于int类型存不下的数据,换成int unsigned同样可能存不下,那还不如直接设置成一个更大的int类型;- 较小的整形索引更快,选择合适的类型可以节省空间,而且整形比字符串要更加高效;
 
bit位类型
1.语法格式
            
            
              sql
              
              
            
          
          BIT(M) -- M表示位数, 范围1-64
        2.基本用法
- 单比特存储
 
            
            
              sql
              
              
            
          
          create table flags(
    id int,
    is_active bit(1),    -- 存储0/1
    is_deleted bit(1)    -- 存储0/1
);
        - 多比特存储
 
            
            
              sql
              
              
            
          
          create table permissions(
    id int,
    user_flag bit(8),   -- 8位用户权限
    system_flag bit(32) -- 32位系统标志
);
        3.存储范围:
            
            
              sql
              
              
            
          
          BIT(1)   -- 0 或 1
BIT(8)   -- 0 到 255
BIT(16)  -- 0 到 65535
BIT(32)  -- 0 到 4294967295
BIT(64)  -- 0 到 18446744073709551615
        4.插入数据:
            
            
              sql
              
              
            
          
          -- 方式1:使用十进制
insert into permissions values(1001, 21, 252);
-- 方式2:使用b前缀(b表示二进制字面量) 比较推荐这种写法
insert into permissions values(1002, b'10101', b'11111100');
-- 方式3:使用十六进制
insert into permissions values(1003, 0x15, 0xFC);
        5.查询和显示:
            
            
              sql
              
              
            
          
          -- 默认显示
select *from permissions;
        在较新版本的MySQL8.0中,BIT类型默认以十六进制格式显示(在老版本中会显示看不见任何数据):

除了默认格式显示,也可以指定形式显示:
            
            
              sql
              
              
            
          
           select id,
    bin(user_flag) as user_flag_binary,  -- 二进制格式显示
    hex(system_flag) as system_flag_hex  -- 十六进制格式显示
    from permissions;
        
float小数类型
float是单精度浮点数类型,用于存储小数数据;
1.基本语法:
            
            
              sql
              
              
            
          
          float[(M,D)] [unsigned] [zerofill]
        M:总位数(精度);D:小数点后的位数(标度);unsigned:无符号(非负数);zerofill:用零填充;
存储范围和精度:
            
            
              sql
              
              
            
          
          -- FLOAT的存储特性
-- 范围:-3.402823466E+38 到 -1.175494351E-38, 0, 1.175494351E-38 到 3.402823466E+38
-- 精度:约7位十进制数字
        2.常用示例:
- 创建表时使用
float: 
            
            
              sql
              
              
            
          
          create table products(
    name varchar(30),
    price float(8,2),
    weight float(8,3),
    rating float,
    discount float(3,2) unsigned
);
        - 插入数据:
 
            
            
              sql
              
              
            
          
          insert into products values
    ('苹果', 5.99, 0.250, 4.5, 0.10),
    ('香蕉', 4.88, 0.200, 4.0, 0.15),
    ('橙子', 3.99, 0.300, 3.9, 0.20);
        - 查询和计算:
 
            
            
              sql
              
              
            
          
          -- 基本查询
select * from products;
-- 数学计算
 select 
    name,
    price,
    price*(1-discount) as final_price -- 计算折扣后的价格
    from products;
        
3.精度问题
以float(4,2)为例,表示的范围就是-99.99-99.99,MySQL在保存数据时会进行四舍五入;如果是float(8.2),表示的范围就是-99999999.99-99999999.99,同样也是四舍五入;
            
            
              sql
              
              
            
          
          insert into products values
    ('葡萄', 2.991, 0.150, 4.1, 0.15),
    ('桃子', 2.947, 0.350, 3.7, 0.20);
        
如果是一个float(4,2) unsigned 无符号的,这时表示范围就是0-99.99,直接把负数舍弃掉;
除了float之外,还有一个浮点数类型decimal ,它的用法和float一模一样,float怎么用,decimal就怎么用(这里就不展示示例了),唯一的区别就是表示的精度不同;
            
            
              sql
              
              
            
          
          create table test(
    id int,
    f1 float(10,8),
    f2 decimal(10,8)
);
        
对于插入相同的一个浮点数,float和decimal因为精度不同,导致存储的数据不同;
float的精度大约为7位;decimal整数最大位数m为65位,如果m省略,默认位10;支持小数最大位数d是30,如果d被省略,默认为0;- 如果希望小数的精度高,推荐使用
decimal; 
3.字符串类型
CHAR 类型
- 
固定长度:无论存储多少字符,都占用相同的存储空间;
 - 
语法:char(M) 其中 M 是字符数(1-255),char(2)表示可以存放两个字符,可以是字母或汉字,但是不能超过2个;
 - 
存储方式:总是占用 M 个字符的存储空间,不足的部分用空格填充;
 
VARCHAR 类型
- 
可变长度:根据实际存储的字符数占用存储空间;
 - 
语法:varchar(M) 其中 M 是最大字符数(不能超过65535字节);
 - 
存储方式:只占用实际字符数 + 1-3字节的长度前缀(用来记录数据大小);
 
示例:
            
            
              sql
              
              
            
          
          create table student(
    name varchar(30),
    gender char(2)
);
insert into student values('张三', '男'),('李四', '女');
select * from student;
+--------+--------+
| name   | gender |
+--------+--------+
| 张三   | 男     |
| 李四   | 女     |
+--------+--------+
        注意点:
varchar(M)中,M的大小和表的编码密切相关;
在编码utf8中,一个字符占用3个字节,假设长度前缀占用一个字符,就是三个字节,所以实际上有效字节数就是65535-3=65532;有效字符数就是65532/3=21844;
所以在创建表时,使用varchar定义的字符大小一定不能超过21844,这是单个varchar列的限制:
            
            
              sql
              
              
            
          
          create table s1(
    name varchar(21844),  -- 21844 * 3 = 65532字节
)charset utf8;
        
但是还要考虑整行大小限制 ,一行除了varchar大小之外,还有其他字段的大小,比如下面这种情况:
            
            
              sql
              
              
            
          
          create table s1(
    name varchar(21844),  -- 21844 * 3 = 65532字节
    gender char(2)        -- 2 * 3 = 6字节
)charset utf8;
        实际计算:
- 
name列:21844字符 × 3字节 = 65532字节 - 
gender列:2字符 × 3字节 = 6字节 - 
VARCHAR长度前缀:3字节(存储实际长度) - 
总计:65532 + 6 + 3 = 65541字节 > 65535字节
 
正确的最大长度应该是:
            
            
              sql
              
              
            
          
          -- 计算:65535 - 其他列开销 - VARCHAR长度前缀
-- 65535 - 6 - 3 = 65526字节
-- 65526 ÷ 3 = 21842字符
        
char和varchar比较:
| 实际存储 | char(4) | varchar(4) | char占用字节 | varchar占用字节 | 
|---|---|---|---|---|
| abcd | abcd | abcd | 4*3=12 | 4*3+1=13 | 
| A | A | A | 4*3=12 | 1*3+1=4 | 
| Abcde | 错 | 错 | 数据超过长度 | 数据超过长度 | 
如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
4日期和时间类型
常用的日期有以下三个:
date:日期yyyy-mm-dd,占用三个字节;datetime:时间日期格式yyy-mm-dd hh:ii:ss表示范围从1000到9999,占用八个字节;timestap:时间戳,从1970年开始的yyyy-mm-dd hh-ii-ss格式和datetime完全一致,占用四个字节;
示例:
            
            
              sql
              
              
            
          
          create table birthday(
    -> t1 date,
    -> t2 datetime,
    -> t3 timestamp default current_timestamp
    -> );
        default current_timestamp:在插入数据时不用输入,时间戳会自动补上当前时间;通常用来更新数据的插入时间;

5.enum和set
enum类型
1.基本语法
            
            
              sql
              
              
            
          
          enum('值1', '值2', '值3', ...);
        2.存储机制-数字存储
- 
内部存储:用整数存储(1, 2, 3...),可以理解为从1开始的下标;
 - 
值1 = 1,值2 = 2,值3 = 3...以此类推;
 - 
存储空间:1-2字节(取决于选项数量);
 
3.常用示例
            
            
              sql
              
              
            
          
          -- 创建表
create table student (
    name varchar(50),
    gender enum('男', '女'),
    status enum('active', 'inactive', 'pending')
);
-- 插入数据
insert into users values 
('张三', '男', '1'),
('李四', '女', '2'),
('赵六', '1', '3');
-- 查询(可以用数字代替字符串)
select * from student where gender = 1;  -- 等同于 where gender = '男'
select * from student where status = 2;  -- 等同于 where status = 'inactive'
        
4.数字存储验证:
            
            
              sql
              
              
            
          
          select 
    gender,
    gender + 0 as gender_number,
    status,
    status + 0 as status_number
    from student;
        
set类型
1.基本语法
            
            
              sql
              
              
            
          
          set('值1', '值2', '值3', ...)
        2.存储机制-位掩码存储
- 
内部存储:用位掩码(bitmask)存储;
 - 
值1 = 1 (001),值2 = 2 (010),值3 = 4 (100);
 - 
组合存储:多个值用位运算组合;
 - 
存储空间:1-8字节(取决于选项数量);
 
3.位掩码示例
            
            
              sql
              
              
            
          
          -- 假设 set('A', 'B', 'C', 'D');
-- A = 1(0001)
-- B = 2(0010)
-- C = 4(0100)
-- D = 8(1000)
-- 组合存储
-- 'A, B' = 1 + 2 = 3(0011)
-- 'A, C' = 1 + 4 = 5(0101)
-- 'B, C, D' = 2 + 4 + 8 = 14(1110)
        4.常用示例
            
            
              sql
              
              
            
          
          -- 创建测试表
 create table student(
    name varchar(30),
    gender char(2),
    hobby set('篮球', '足球', '羽毛球', '乒乓球')
    );
    
-- 插入数据
insert into student values
    ('张三', '男', '篮球'),
    ('李四', '女', '羽毛球, 乒乓球'),
    ('王五', '男', '2'),
    ('赵六', '女', '7');
    
-- 查询
select * from student;
select * from student where hobby = 1;       -- 1对应0001,篮球
select * from student where hobby = '羽毛球'; -- 查找羽毛球的
        
这里就有一个问题了,在查找羽毛球时,显示为空,但是表中明明有人包含了羽毛球,为什么会没有显示出来呢?
这是因为set类型的精确匹配特性:
- 
where hobby= '羽毛球' 是精确匹配; - 
它只查找 hobby 字段完全等于 '羽毛球' 的记录;
 - 
而在上面的数据中,羽毛球都是和其他爱好组合在一起的;
 
但是我们实际生活中每个人都有好几个爱好,总不能必须只有一个爱好才能查找出来吧?当然不是,这时候就要借助其他查找方式了
这里推荐两种方式:
- 使用
find_in_set函数: 
            
            
              sql
              
              
            
          
          select * from student where find_in_set('羽毛球', hobby);
        - 使用位运算:
 
            
            
              sql
              
              
            
          
          -- SET('篮球', '足球', '羽毛球', '乒乓球') 的位掩码
-- 篮球=1, 足球=2, 羽毛球=4, 乒乓球=8
select * from student where hobby & 4;
        
5.位掩码存储验证
            
            
              sql
              
              
            
          
          select 
    name,
    hobby,
    hobby + 0 as hobby_number
    from student;
        
总结
性能优势:
enum优势:
存储效率高:1-2字节 vs VARCHAR的变长存储
查询速度快:整数比较比字符串比较快
索引效率高:整数索引更紧凑
set优势:
多选存储:一个字段存储多个值
位运算查询:支持高效的位运算查询
存储紧凑:多个选项组合存储
注意事项:
enum注意事项:
- 数字转换:可以用数字代替字符串,但不推荐
 - 修改选项:修改ENUM选项会影响现有数据
 - 空值:NULL和空字符串是不同的
 set注意事项:
- 顺序无关:'A,B' 和 'B,A' 等价
 - 重复值:自动去重
 - 位运算:理解位掩码有助于高级查询
 
位掩码存储验证**
以上就是关于MySQL数据类型中常用的几个类型的使用讲解,如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!