003MySQL最常用的数据类型详解
文章目录
前言
一、MySQL常用数据类型概览
二、整数类型(INT、TINYINT)
1. INT(标准整数)
2. TINYINT(小整数)
三、精确小数类型(DECIMAL)
四、字符串类型(VARCHAR)
五、日期时间类型(DATETIME)
六、长文本类型(TEXT)
七、补充:无符号与取值范围
1. 什么是无符号(UNSIGNED)?
2. 何时使用 UNSIGNED?
3. 为什么无符号的正数范围会扩大一倍?
总结
前言
在数据库设计与日常测试中,选择合适的字段类型至关重要。本文系统梳理了MySQL中最常用的几种数据类型,包括整数、小数、字符串、日期时间及长文本等,并结合实际业务场景说明它们的适用场景与注意事项。无论你是开发人员还是测试工程师,掌握这些基础类型都能让你更高效地处理数据验证、查询与问题排查。
一、MySQL常用数据类型概览
类型 | 占用空间 | 用途 | 示例 |
INT | 4 字节 | 用户ID、数量 |
|
TINYINT | 1 字节 | 状态标识(0/1/2) |
|
DECIMAL | 变长 | 金额、价格 |
|
VARCHAR | 变长 | 用户名、手机号 |
|
DATETIME | 8 字节 | 注册时间、下单时间 |
|
TEXT | 变长 | 文章正文、备注 |
|
二、整数类型(INT、TINYINT)
1. INT(标准整数)
- 占用4 字节
- 有符号范围:
-2147483648 ~ 2147483647 - 无符号范围:
0 ~ 4294967295
-- 有符号(默认),可存负数 id INT -- 范围:-2147483648 ~ 2147483647 -- 无符号,只能存正数,范围扩大一倍 id INT UNSIGNED -- 范围:0 ~ 42949672952. TINYINT(小整数)
- 占用1 字节
- 有符号范围:
-128 ~ 127 - 无符号范围:
0 ~ 255
-- 有符号(默认),可存负数 status TINYINT -- 范围:-128 ~ 127 -- 无符号,只能存正数,范围扩大一倍 status TINYINT UNSIGNED -- 范围:0 ~ 255,常用于状态标识典型场景:状态标识、开关字段,几乎每个表都有几个,测试时经常要查。
三、精确小数类型(DECIMAL)
DECIMAL(M,D)用于存储精确小数,其中M为总位数,D为小数位数。它按每一位数字独立存储,不存在浮点数误差。
price DECIMAL(10,2) -- 共10位,小数2位,整数8位必须使用 DECIMAL 存储金额,严禁使用 FLOAT(会有精度误差)。测试订单、金额相关功能时经常遇到该类型。
四、字符串类型(VARCHAR)
VARCHAR(N)为可变长度字符串,实际占用空间 = 实际字符数 + 1~2 字节(用于记录长度)。N表示最多可存储的字符数,中文和英文均计为 1 个字符。
username VARCHAR(20) -- 最多存20个字符典型场景:用户名、手机号、地址等文本信息,是测试中查询最频繁的类型之一。
五、日期时间类型(DATETIME)
DATETIME占用8 字节,格式为'YYYY-MM-DD HH:MM:SS',可表示从1000-01-01 00:00:00到9999-12-31 23:59:59。
created_at DATETIME -- 格式:'2026-06-27 14:30:00'典型场景:订单时间、注册时间、更新时间,查数据时经常要按时间筛选。
六、长文本类型(TEXT)
TEXT用于存储不定长的大文本内容,最大长度为65535 字节(约 64 KB)。实际占用空间随内容动态变化。
content TEXT -- 存储文章正文、备注等不定长内容典型场景:文章内容、备注说明,测试中较少直接查询,但验证数据完整性时会用到。
七、补充:无符号与取值范围
1. 什么是无符号(UNSIGNED)?
默认情况下,整数类型为有符号,可以存储负数。加上UNSIGNED关键字后,该字段只能存储非负数,且正数范围扩大一倍。
-- TINYINT 示例(1字节) age TINYINT -- 可存 -128 ~ 127 age TINYINT UNSIGNED -- 可存 0 ~ 255 -- INT 示例(4字节) id INT -- 可存 -21亿 ~ 21亿 id INT UNSIGNED -- 可存 0 ~ 42亿2. 何时使用 UNSIGNED?
- 建议加:年龄、数量、ID等不可能为负数的字段。
- 不建议加:温度、资金等可能需要负数的字段。
3. 为什么无符号的正数范围会扩大一倍?
这要从计算机如何存储数字说起。
(1)比特(bit)与字节(Byte)
计算机存储数据的最小单位是bit(比特),一个 bit 只能存两种状态:0 或 1,就像一个开关——要么关(0),要么开(1)。
1 个字节 = 8 个 bit,这是计算机处理数据的基本单位。
(2)以 TINYINT 为例(1字节 = 8 bit)
8 个 bit 可以表示 2⁸ = 256 种不同的值。
有符号(默认):拿第 1 个 bit 当“正负号”(0 代表正数,1 代表负数),剩下 7 个 bit 表示数字大小。
- 7 个 bit 能表示 2⁷ = 128 种数值
- 正数:0 ~ 127(128 个),负数:-1 ~ -128(128 个)
- 总共 256 种组合,范围是-128 ~ 127
无符号(UNSIGNED):8 个 bit 全部用来表示数字大小,没有正负号。
- 8 个 bit 能表示 2⁸ = 256 种数值
- 范围是0 ~ 255
TINYINT 对比结果:
类型 | 符号位 | 存数值的位数 | 组合数 | 范围 |
有符号 | 占 1 位 | 7 位 | 2⁷ = 128 | -128 ~ 127 |
无符号 | 不占位 | 8 位 | 2⁸ = 256 | 0 ~ 255 |
无符号省去了“正负号”占用的 1 个 bit,把省下来的 bit 用于存数值,相当于多了一位二进制数。二进制中每多一位,数值范围就翻一倍(二进制多 1 位就乘以 2¹ = 2,十进制多 1 位就乘以10¹ = 10,十进制多 2 位就乘以10² = 100),所以无符号的正数上限从 127 扩大到 255,正好扩大了一倍。
(3) INT 同理(4字节 = 32 bit)
类型 | 存数值的位数 | 组合数 | 范围 |
有符号 | 31 位 | 2³¹ = 21亿 | -2147483648 ~ 2147483647 |
无符号 | 32 位 | 2³² = 42亿 | 0 ~ 4294967295 |
31 bit:2^31=2,147,483,648,32 bit:2^32=4,294,967,296
同样,无符号的正数上限从 21亿 扩大到 42亿,扩大了一倍。
符号把用于表示“正负号”的那 1 个 bit 省下来,全部用来存数值,相当于多了一位二进制位,数值范围因此翻倍。
总结
本文涵盖了 MySQL 开发与测试中最常用的几种数据类型:INT、TINYINT、DECIMAL、VARCHAR、DATETIME和TEXT,并逐一说明了它们的存储空间、取值范围及典型应用场景。特别强调了DECIMAL对于金额的不可替代性,以及UNSIGNED对整数范围的影响和原理。在实际建表时,建议根据业务含义明确选择类型,并在合适的情况下使用无符号以优化存储范围,从而提升数据准确性和查询效率。