数据库---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 数据类型最全、最细、最贴近教材、最适合实战的完整版手册,不管是学习、面试、建表都够用。


总结

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

相关推荐
a7963lin5 小时前
PHP怎么实现单例模式_PHP常用设计模式之单例模式【方法】
jvm·数据库·python
辞旧 lekkk12 小时前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
2301_8092047013 小时前
JavaScript中严格模式use-strict对引擎解析的辅助.txt
jvm·数据库·python
zjy2777713 小时前
mysql如何选择合适的索引类型_mysql索引设计实战
jvm·数据库·python
笨蛋不要掉眼泪14 小时前
Mysql架构揭秘:update语句的执行流程
数据库·mysql·架构
万邦科技Lafite14 小时前
京东item_get接口实战案例:实时商品价格监控全流程解析
java·开发语言·数据库·python·开放api·淘宝开放平台
秋915 小时前
ruoyi项目更换为mysql9.7.0数据库
数据库
Andya_net15 小时前
MySQL | MySQL 8.0 权限管理实践-精确赋予库、表只读等权限
android·数据库·mysql
筑梦之路16 小时前
harbor数据库报错权限异常如何处理——筑梦之路
数据库·harbor
czlczl2002092517 小时前
理解 MySQL 行锁:两阶段锁协议与热点更新优化
数据库·mysql