乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

数值类型

导学

选错数值类型会导致空间浪费、精度丢失,甚至数据溢出。本节系统讲解 MySQL 5.7 的整数和浮点类型,帮你建立"该用什么类型"的判断力。

定义

数值类型:用于存储整数、定点数、浮点数的数据类型。MySQL 5.7 提供整数类型(TINYINT 到 BIGINT)、定点数(DECIMAL)、浮点数(FLOAT、DOUBLE)。

整数类型

类型有符号范围无符号范围存储空间
TINYINT-128 ~ 1270 ~ 2551 字节
SMALLINT-32768 ~ 327670 ~ 655352 字节
MEDIUMINT-8388608 ~ 83886070 ~ 167772153 字节
INT / INTEGER-2147483648 ~ 21474836470 ~ 42949672954 字节
BIGINT-9223372036854775808 ~ 92233720368547758070 ~ 184467440737095516158 字节

整数类型范围演示

当前数据状态:

CREATE TABLE employees (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(20),
    dept VARCHAR(20),
    score DECIMAL(5,2)
);

INSERT INTO employees (emp_name, dept, score) VALUES
('大翔', '技术部', 100),
('白歌', '技术部', NULL);

当前表数据:

emp_idemp_namedeptscore
1大翔技术部100
2白歌技术部NULL

emp_id 使用 INT 类型,score 使用 DECIMAL(5,2) 类型。

验证范围边界:

-- TINYINT UNSIGNED 最大值为 255
SELECT CAST(255 AS TINYINT UNSIGNED) AS max_tinyint;

-- INT UNSIGNED 最大值为 4294967295
SELECT CAST(4294967295 AS INT UNSIGNED) AS max_int;

结果:

max_tinyintmax_int
2554294967295

溢出警告演示:

-- 有符号 TINYINT 最大值为 127,128 会溢出
SELECT CAST(128 AS TINYINT) AS overflow_demo;

结果:

overflow_demo
127

结果解读:CAST(128 AS TINYINT) 中,TINYINT 是有符号类型,范围 -128 ~ 127,128 超出范围被截断为最大值 127。生产环境中,超出范围的插入在严格模式下会产生错误。

选型建议:

  • 状态标志、布尔值:TINYINT(MySQL 没有真正的布尔类型,BOOL 是 TINYINT(1) 的别名)
  • 年龄、小范围计数:TINYINT UNSIGNED
  • 常规主键、行数:INT UNSIGNED(42 亿足够绝大多数场景)
  • 分布式 ID、时间戳、大数量统计:BIGINT UNSIGNED

易错点:INT(11) 中的 11 只是显示宽度提示,不影响存储范围或性能。配合 ZEROFILL 时才影响显示,但 ZEROFILL 会隐式添加 UNSIGNED。

INT(M) 显示宽度演示

CREATE TABLE zerofill_demo (
    id1 INT(5),
    id2 INT(5) ZEROFILL,
    id3 INT
);

INSERT INTO zerofill_demo VALUES (123, 123, 123);

SELECT * FROM zerofill_demo;

结果:

id1id2id3
12300123123

结果解读:INT(5) ZEROFILL 会在显示时左侧补零到 5 位宽度,但存储空间和数值范围与 INT 完全相同。id2 显示为 00123,但实际存储的值仍是 123。

定点数 DECIMAL

DECIMAL(M, D)
  • M:总精度(总位数),最大 65
  • D:小数位数,最大 30

适用场景:货币、金额、税率等对精度要求严格的场景。绝不使用 FLOAT/DOUBLE 存金额。

DECIMAL 精度演示

DECIMAL(M, D) 中 M 为总精度(最大 65),D 为小数位数(最大 30)。

适用场景:货币、金额、税率等对精度要求严格的场景。绝不使用 FLOAT/DOUBLE 存金额。

DECIMAL(10, 2) 可存储 -99999999.99 到 99999999.99。

浮点数 FLOAT / DOUBLE

类型精度存储空间
FLOAT单精度,约 7 位有效数字4 字节
DOUBLE双精度,约 15 位有效数字8 字节

浮点数精度误差演示

当前数据状态:

CREATE TABLE precision_test (
    id INT PRIMARY KEY,
    f_val FLOAT,
    d_val DOUBLE,
    dec_val DECIMAL(20, 10)
);

INSERT INTO precision_test VALUES
(1, 0.1, 0.1, 0.1);

当前表数据:

idf_vald_valdec_val
10.10.10.1000000000

操作语句:

SELECT
    id,
    f_val,
    d_val,
    dec_val,
    f_val + 0.2 AS float_sum,
    d_val + 0.2 AS double_sum,
    dec_val + 0.2 AS decimal_sum
FROM precision_test;

操作后的数据状态:

idf_vald_valdec_valfloat_sumdouble_sumdecimal_sum
10.10.10.10000000000.300000010.300000000000000040.3000000000

结果解读:

  • FLOAT 的 0.1 + 0.2 产生了明显误差 0.30000001
  • DOUBLE 的误差更小但仍有 0.30000000000000004
  • DECIMAL 精确得到 0.3000000000
  • 浮点数在计算机中以二进制近似存储,无法精确表示某些十进制小数(如 0.1)
  • 金额计算必须使用 DECIMAL,绝不能用 FLOAT 或 DOUBLE

关键警告:FLOAT(10,2) 存储的金额 10.2 减去 10.1 可能不是精确的 0.1。金额计算务必用 DECIMAL。

常见误区

误区正解
INT(11) 比 INT(10) 存储范围大显示宽度不影响存储,两者范围完全相同。
金额用 FLOAT 或 DOUBLE浮点数有精度误差,金额必须用 DECIMAL。
UNSIGNED 只是不允许负数同时使正数范围翻倍,如 INT UNSIGNED 最大 42 亿。
数值类型越大约好更大的类型占用更多存储和内存,影响索引效率和缓存命中率。

面试考点

Q:DECIMAL 和 FLOAT 的区别?

DECIMAL 是定点数,以字符串形式存储,无精度损失,适合金额;FLOAT 是浮点数,二进制近似存储,有精度误差,适合科学计算。

Q:MySQL 有没有布尔类型?

没有。BOOL 和 BOOLEAN 是 TINYINT(1) 的同义词。0 表示假,非 0 表示真。

Q:INT(10) 和 INT(11) 有什么区别?

没有本质区别。括号中的数字是显示宽度提示,仅当配合 ZEROFILL 时影响输出格式(如 INT(5) ZEROFILL 存储 123 显示为 00123)。

小结

  • 整数类型按范围选择,常规主键用 INT UNSIGNED,大 ID 用 BIGINT
  • INT(M) 的 M 只是显示宽度,不影响存储
  • 金额必须用 DECIMAL,绝不能用 FLOAT/DOUBLE
  • 浮点数只用于对精度不敏感的科学计算场景

下一章引子:数值之外,数据库中存储更多的是文本——姓名、地址、描述信息。字符串类型的选择同样关键。

下一页
字符串类型