数据库---Day3 数据类型

本系列可作为数据库学习系列的笔记,文中提到的一些练习的代码,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。

点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励!

系列文章目录

JAVA初阶---------已更完

JAVA数据结构---------已更完

数据库---Day 1 数据库基础

数据库---Day2 数据库操作

数据库---Day3 数据类型

数据库---Day4 数据表的操作

数据库---Day5 数据表的增删改查


目录

目录

系列文章目录

目录

前言

一、为什么必须学数据类型

二、数值类型(最常用、最容易溢出)

[2.1 整数类型完整列表(含大小、范围、用途)](#2.1 整数类型完整列表(含大小、范围、用途))

特别说明

[2.2 小数类型(浮点 vs 定点)](#2.2 小数类型(浮点 vs 定点))

[2.2.1 FLOAT(单精度)](#2.2.1 FLOAT(单精度))

[2.2.2 DOUBLE(双精度)](#2.2.2 DOUBLE(双精度))

[2.2.3 DECIMAL (M,D)(高精度定点数)](#2.2.3 DECIMAL (M,D)(高精度定点数))

开发铁律(必背)

三、字符串类型(最复杂、面试最多)

[3.1 字符串类型完整清单](#3.1 字符串类型完整清单)

[3.2 CHAR 与 VARCHAR 深度对比(面试高频)](#3.2 CHAR 与 VARCHAR 深度对比(面试高频))

[3.2.1 CHAR (M) 固定长度](#3.2.1 CHAR (M) 固定长度)

[3.2.2 VARCHAR (M) 可变长度](#3.2.2 VARCHAR (M) 可变长度)

[3.2.3 经典示例(文档原版)](#3.2.3 经典示例(文档原版))

[3.3 VARCHAR 与 TEXT 深度区别(开发必懂)](#3.3 VARCHAR 与 TEXT 深度区别(开发必懂))

[3.4 ENUM 与 SET(极高效、极省空间)](#3.4 ENUM 与 SET(极高效、极省空间))

[3.4.1 ENUM 枚举(单选)](#3.4.1 ENUM 枚举(单选))

[3.4.2 SET 集合(多选)](#3.4.2 SET 集合(多选))

四、二进制类型(存文件、字节流)

五、日期与时间类型(自动维护、时区、自动更新)

[5.1 日期类型完整清单](#5.1 日期类型完整清单)

[关键参数:fsp 小数秒精度](#关键参数:fsp 小数秒精度)

常用系统时间函数

[5.2 DATETIME 与 TIMESTAMP 核心区别](#5.2 DATETIME 与 TIMESTAMP 核心区别)

DATETIME

TIMESTAMP

开发最佳实践

六、字符串排序规则与字符集(文档重点)

七、最全开发选型指南(直接照着用)

[7.1 数值类型怎么选](#7.1 数值类型怎么选)

[7.2 字符串怎么选](#7.2 字符串怎么选)

[7.3 日期怎么选](#7.3 日期怎么选)

八、全文总结(极简版)


前言

小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!

在 MySQL 建表时,字段数据类型是决定表性能、存储空间、数据准确性与后期扩展性的核心。选得不对,轻则数据溢出、精度丢失,重则索引失效、查询缓慢、重构困难。

一、为什么必须学数据类型

在面向对象开发里:

  • 类 → 数据库表
  • 类属性 → 表字段
  • 对象实例 → 表行数据

要给字段存值,就必须先规定它能存什么、占多大空间、怎么存储 。这就是数据类型

MySQL 常用数据类型分为四大类:

  1. 数值类型
  2. 字符串类型
  3. 二进制类型
  4. 日期与时间类型

二、数值类型(最常用、最容易溢出)

数值类型分为:整数、浮点数、定点数、位类型、布尔型

2.1 整数类型完整列表(含大小、范围、用途)

类型 占用字节 有符号范围 无符号(UNSIGNED)范围 典型业务场景
BIT(M) 1~64 位 --- --- 位存储、开关
TINYINT 1 -128 ~ 127 0 ~ 255 状态、性别、是否删除
SMALLINT 2 -32768 ~ 32767 0 ~ 65535 类型、小枚举
MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215 较大计数
INT / INTEGER 4 -2147483648 ~ 2147483647 0 ~ 4294967295 用户 ID、订单 ID、通用数字
BIGINT 8 -2⁶³ ~ 2⁶³-1 0 ~ 2⁶⁴-1 分布式 ID、超大金额、日志 ID

特别说明

  • BOOL / BOOLEAN 本质就是 TINYINT(1)

    • 0 → false
    • 非 0 → true
  • **BIT(M)**M 表示位数,1~64,省略 M 则默认 1 位。适合存极省空间的布尔位。

2.2 小数类型(浮点 vs 定点)

2.2.1 FLOAT(单精度)

  • 占用:4 字节
  • 精度:约 7 位有效数字
  • 语法:FLOAT(M,D)M = 总位数,D = 小数位数

2.2.2 DOUBLE(双精度)

  • 占用:8 字节
  • 精度:约 15 位有效数字
  • 语法:DOUBLE(M,D)

2.2.3 DECIMAL (M,D)(高精度定点数)

  • 占用:动态字节
  • 无精度丢失(最关键)
  • M 最大:65
  • D 最大:30
  • 默认:DECIMAL (10,0)

M中不计算小数喊口号和负数的,如果D为0,则具体的值不保存小数点和小数部分(也就是说保存的是一个整数)

开发铁律(必背)

  • 金额、价格、财务、交易 → 必须用 DECIMAL
  • 禁止用 FLOAT/DOUBLE 存钱,会出现精度丢失!

在有些系统中表示金额,一般把元为单位换成分,然后用int类型表示金额。

三、字符串类型(最复杂、面试最多)

字符串分为:

  • 定长字符串:CHAR
  • 变长字符串:VARCHAR
  • 文本类型:TINYTEXT / TEXT / MEDIUMTEXT / LONGTEXT
  • 二进制字符串:BINARY / VARBINARY / BLOB 系列
  • 枚举:ENUM
  • 集合:SET

3.1 字符串类型完整清单

类型 说明 最大长度
CHAR(M) 固定长度字符 255 字符
VARCHAR(M) 可变长度字符 65535 字节
TINYTEXT 极小文本 255 字节
TEXT 普通文本 65535 字节(64KB)
MEDIUMTEXT 中文本 16MB
LONGTEXT 大文本 4GB
BINARY(M) 固定长度二进制 255 字节
VARBINARY(M) 可变长度二进制 65535 字节
TINYBLOB 小二进制 255 字节
BLOB 二进制 64KB
MEDIUMBLOB 中二进制 16MB
LONGBLOB 大二进制 4GB
ENUM 单选枚举 65535 个值
SET 多选集合 64 个值

3.2 CHAR 与 VARCHAR 深度对比(面试高频)

3.2.1 CHAR (M) 固定长度

  • M:字符数,0~255
  • 不足长度用空格填充
  • 查询时自动删除尾部空格
  • 速度快、浪费空间
  • 适合:长度固定的数据例:身份证、手机号、学号、邮编、MD5、UUID

3.2.2 VARCHAR (M) 可变长度

  • M:最大字符数
  • 实际用多少存多少
  • 1~2 字节 记录真实长度
    • ≤255 字节:1 字节
    • 255 字节:2 字节

  • 查询时保留尾部空格
  • 节省空间、速度略低
  • 适合:长度不固定的数据例:姓名、标题、地址、备注

3.2.3 经典示例(文档原版)

sql 复制代码
CREATE TABLE vc (
  v VARCHAR(4),
  c CHAR(4)
);

INSERT INTO vc VALUES ('ab ', 'ab ');

查询:

sql 复制代码
SELECT CONCAT('(',v,')'), CONCAT('(',c,')') FROM vc;

结果:

bash 复制代码
(ab)      (ab)

原因:

  • CHAR 会删掉末尾空格
  • VARCHAR 会截断超长空格并报警告

3.3 VARCHAR 与 TEXT 深度区别(开发必懂)

对比项 VARCHAR TEXT
最大长度 65535 字节 65535 字节,超了自动升级
存储方式 <768 字节存行内,否则溢出 全部存在溢出页
索引 可以建普通索引 不能直接建普通索引,只能全文索引
查询性能
适用场景 需要检索、短内容 大内容、不常检索

开发原则:能 VARCHAR 绝对不用 TEXT!

3.4 ENUM 与 SET(极高效、极省空间)

3.4.1 ENUM 枚举(单选)

  • 从列表中只能选一个
  • 内部以整数存储
  • 最多 65535 个选项

示例:

sql 复制代码
gender ENUM('男','女','未知')

3.4.2 SET 集合(多选)

  • 从列表中可选多个
  • 内部以整数存储
  • 最多 64 个选项

示例:

sql 复制代码
hobby SET('游泳','跑步','游戏','读书')

四、二进制类型(存文件、字节流)

二进制类型和字符串对应,但存的是字节,不是字符

  • BINARY → 对应 CHAR
  • VARBINARY → 对应 VARCHAR
  • BLOB 系列 → 对应 TEXT 系列

用途:

  • 图片字节
  • 文件流
  • 加密字节
  • 不适合直接阅读的二进制数据

现代开发一般不把文件存在数据库,而是存文件路径,二进制类型用得越来越少。

五、日期与时间类型(自动维护、时区、自动更新)

MySQL 提供 5 种日期时间类型,比用字符串存时间更省空间、更容易排序、更安全。

5.1 日期类型完整清单

类型 字节 范围 格式 用途
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~9999 YYYY-MM-DD hh:mm:ss 业务时间
TIMESTAMP 4 1970-2038 时间戳 更新时间、自动维护

关键参数:fsp 小数秒精度

  • 0~6 位,默认 0
  • 示例:DATETIME(3) 精确到毫秒
  • 示例:TIMESTAMP(6) 精确到微秒

常用系统时间函数

  • NOW() / CURRENT_TIMESTAMP → 当前日期时间
  • CURDATE() → 当前日期
  • CURTIME() → 当前时间

5.2 DATETIME 与 TIMESTAMP 核心区别

DATETIME

  • 范围大:1000--9999
  • 不受时区影响
  • 手动赋值
  • 占用 8 字节

TIMESTAMP

  • 范围小:1970--2038
  • 受时区影响
  • 可设置 ON UPDATE CURRENT_TIMESTAMP
  • 占用 4 字节

开发最佳实践

  • 业务时间(创建时间、生日、下单时间)→ DATETIME
  • 更新时间(自动刷新)→ TIMESTAMP

六、字符串排序规则与字符集(文档重点)

  • 字符串以字符为单位 ,可单独指定字符集与排序规则例:utf8mb4 + utf8mb4_0900_ai_ci

  • 二进制以字节为单位 ,排序按数字编码例:utf8mb4_bin

  • _ci:大小写不敏感

  • _cs:大小写敏感

  • _bin:二进制比较

七、最全开发选型指南(直接照着用)

7.1 数值类型怎么选

  • 状态 / 是否删除 / 性别 → TINYINT
  • 普通 ID / 计数 → INT
  • 超大 ID / 分布式 ID → BIGINT
  • 金额 / 价格 / 财务 → DECIMAL
  • 经纬度 / 科学计算 → DOUBLE

7.2 字符串怎么选

  • 长度固定 → CHAR
  • 长度不固定、需索引 → VARCHAR
  • 文章 / 详情 / 不检索 → TEXT
  • 单选状态 → ENUM
  • 多选标签 → SET

7.3 日期怎么选

  • 只存日期 → DATE
  • 完整业务时间 → DATETIME
  • 自动更新时间 → TIMESTAMP
  • 只存年份 → YEAR

八、全文总结(极简版)

  1. 建表先定类型,类型决定性能、空间、安全
  2. 整数选合适大小,不要一律 INT
  3. 钱必须用 DECIMAL
  4. 固定长度用 CHAR,变长用 VARCHAR
  5. 能 VARCHAR 不用 TEXT
  6. 日期不要用字符串,用 MySQL 原生日期类型
  7. ENUM/SET 极快极省空间,适合固定选项

这一篇就是 MySQL 数据类型最全、最细、最贴近教材、最适合实战的完整版手册,不管是学习、面试、建表都够用。


总结

以上就是今天要讲的内容,本文简单记录了数据结构学习内容,仅作为一份简单的笔记使用,大家根据注释理解,您的点赞关注收藏就是对小编最大的鼓励!

相关推荐
羑悻的小杀马特2 小时前
30 分钟零基础搭建 Home Assistant,解锁全屋智能新境界
数据库·人工智能
皙然2 小时前
深入理解 MySQL 事务:从基础到实战,一篇吃透
数据库·mysql
我科绝伦(Huanhuan Zhou)2 小时前
MySQL数据库备份管理系统新增备份任务巡检功能
运维·数据库·mysql
吠品2 小时前
Docker Desktop部署Weaviate向量数据库:从配置到生产环境全流程
数据库·oracle·eureka
倔强的石头1062 小时前
【Linux指南】基础IO系列(三):Linux 系统 IO 接口 —— 深入内核的文件操作
linux·数据库
拾起零碎2 小时前
U8/领料申请单SQL server触发器,如果自定义项13有值,把数量修改成件数乘以自定义项13,如果恰好件数等于现存量,则数量同步出空
数据库
磊 子2 小时前
Redis详解
linux·数据库·redis·缓存
夕除2 小时前
Mysql--14
数据库·mysql
014-code2 小时前
Java Optional 那些被忽略的用法
java·数据库·javase