003MySQL最常用的数据类型详解

文章目录

前言

一、MySQL常用数据类型概览

二、整数类型(INT、TINYINT)

1. INT(标准整数)

2. TINYINT(小整数)

三、精确小数类型(DECIMAL)

四、字符串类型(VARCHAR)

五、日期时间类型(DATETIME)

六、长文本类型(TEXT)

七、补充:无符号与取值范围

1. 什么是无符号(UNSIGNED)?

2. 何时使用 UNSIGNED?

3. 为什么无符号的正数范围会扩大一倍?

总结


前言

在数据库设计与日常测试中,选择合适的字段类型至关重要。本文系统梳理了MySQL中最常用的几种数据类型,包括整数、小数、字符串、日期时间及长文本等,并结合实际业务场景说明它们的适用场景与注意事项。无论你是开发人员还是测试工程师,掌握这些基础类型都能让你更高效地处理数据验证、查询与问题排查。


一、MySQL常用数据类型概览

类型

占用空间

用途

示例

INT

4 字节

用户ID、数量

id INT UNSIGNED

TINYINT

1 字节

状态标识(0/1/2)

status TINYINT UNSIGNED

DECIMAL

变长

金额、价格

price DECIMAL(10,2)

VARCHAR

变长

用户名、手机号

username VARCHAR(20)

DATETIME

8 字节

注册时间、下单时间

created_at DATETIME

TEXT

变长

文章正文、备注

content TEXT


二、整数类型(INT、TINYINT)

1. INT(标准整数)

  • 占用4 字节
  • 有符号范围:-2147483648 ~ 2147483647
  • 无符号范围:0 ~ 4294967295
-- 有符号(默认),可存负数 id INT -- 范围:-2147483648 ~ 2147483647 -- 无符号,只能存正数,范围扩大一倍 id INT UNSIGNED -- 范围:0 ~ 4294967295

2. 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:009999-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 开发与测试中最常用的几种数据类型:INTTINYINTDECIMALVARCHARDATETIMETEXT,并逐一说明了它们的存储空间、取值范围及典型应用场景。特别强调了DECIMAL对于金额的不可替代性,以及UNSIGNED对整数范围的影响和原理。在实际建表时,建议根据业务含义明确选择类型,并在合适的情况下使用无符号以优化存储范围,从而提升数据准确性和查询效率。