在MySQL中,数据类型就像给数据“贴标签”,不同的标签决定了数据如何存储、占用多少空间,以及能做什么操作。选对数据类型,不仅能让数据库更高效、节省存储空间,还能避免数据错误和溢出。对于新手来说,掌握基础数据类型的选择是入门MySQL的第一步。
一、为什么要重视数据类型?¶
选错数据类型的后果可能很严重:比如用INT存手机号(11位数字,INT最大仅支持10位左右),会导致数据溢出;用CHAR(20)存短名字(如“张三”),会浪费19个空格的存储空间。因此,了解数据类型是写好SQL的基础。
二、数值类型:数字怎么存?¶
数值类型是最常用的数据类型,分为整数、浮点数和定点数,各有适用场景。
1. 整数类型¶
-
TINYINT:1字节,范围(有符号:-128~127;无符号:0~255)。常用于存小范围数据,如性别(1=男,0=女)或状态(0=禁用,1=启用)。
注意:括号内的数字(如TINYINT(1))仅表示显示宽度,和存储范围无关(TINYINT(1)和TINYINT(3)存储大小相同)。 -
SMALLINT:2字节,范围(有符号:-32768~32767;无符号:0~65535)。适合中等范围数据,如年龄(假设年龄最大100岁)。
-
INT(INTEGER):4字节,最常用的整数类型,范围(有符号:-2147483648~2147483647;无符号:0~4294967295)。适合用户ID、订单编号等。
-
BIGINT:8字节,范围(有符号:-9223372036854775808~9223372036854775807;无符号:0~18446744073709551615)。仅用于超大数据量场景,如千万级用户ID。
-
无符号整数:加
UNSIGNED表示非负数,如TINYINT UNSIGNED可存0~255,避免负数浪费空间(如年龄TINYINT UNSIGNED足够覆盖0~255岁)。
2. 浮点数类型¶
用于存储小数,如价格、身高、体重。
-
FLOAT:4字节,精度低(约7位有效数字),适合精度要求不高的场景,如温度(
FLOAT(5,2)表示最多5位,2位小数,范围-999.99~999.99)。 -
DOUBLE:8字节,精度高(约15位有效数字),适合精度要求较高的场景,如考试分数(
DOUBLE(4,2)表示4位总长度,2位小数,范围-99.99~99.99)。 -
注意:浮点数可能存在精度误差(如
0.1+0.2=0.30000000000000004),对金融数据(如金额)需用定点数。
3. 定点数类型¶
- DECIMAL(M,D):存储高精度小数,
M总位数,D小数位数,如DECIMAL(10,2)表示“10位数字,2位小数”(范围由M决定,可精确到小数点后30位)。
适用场景:金额(如订单价格)、银行数据等需要精确计算的字段。
三、字符串类型:文本怎么存?¶
字符串类型分为固定长度和可变长度,需根据文本长度选择。
1. 固定长度:CHAR(M)¶
CHAR(M):M为固定长度(1~255字节),不足补空格,适合短且固定的文本。
适用场景:性别(CHAR(1)存“男/女”)、邮政编码(CHAR(6))、固定长度的手机号前缀等。
优点:存储效率高,查询速度快;缺点:浪费空间(如存“张”会补24个空格到CHAR(25))。
2. 可变长度:VARCHAR(M)¶
VARCHAR(M):M为最大长度(1~65535字节,取决于字符集),只存实际内容(不补空格),适合长度不固定的文本。
适用场景:名字(VARCHAR(50))、邮箱(VARCHAR(100))、地址(VARCHAR(200))等。
优点:节省空间;缺点:比CHAR多1-2字节存储长度(如果长度超过255字节,还需额外字节记录长度)。
3. 超长文本:TEXT¶
TEXT:无固定长度限制(最大65535字节),用于存储长文本,如文章内容、评论、备注等。
注意:TEXT不可加默认值,且需配合VARCHAR使用——短文本用VARCHAR,长文本用TEXT。
四、日期时间类型:时间怎么存?¶
MySQL提供多种时间类型,需根据需求选择:
1. DATE:仅存日期¶
- 格式:
YYYY-MM-DD,范围:1000-01-01~9999-12-31。
适用场景:生日、入职日期等只需要日期的字段。
2. DATETIME:存日期+时间¶
- 格式:
YYYY-MM-DD HH:MM:SS,范围:1000-01-01~9999-12-31,占用8字节。
适用场景:订单创建时间、会议开始时间等需要完整日期时间的字段。
3. TIMESTAMP:时间戳(自动更新)¶
- 格式:
YYYY-MM-DD HH:MM:SS,范围:1970-01-01 00:00:01~2038-01-19 03:14:07(32位时间戳),占用4字节。
特点: - 自动随服务器时间更新(如
ON UPDATE CURRENT_TIMESTAMP); - 占用空间小,适合记录时效性强的数据(如用户登录时间、订单支付时间)。
五、其他常用类型¶
1. 布尔类型(TINYINT替代)¶
MySQL没有专门的BOOLEAN类型,用TINYINT(1)表示“真/假”:
- 0=假(FALSE),1=真(TRUE),常用于状态字段(如“是否启用”)。
2. 枚举类型(ENUM)¶
ENUM('男','女'):只能从预设列表中选1个值,避免输入错误(如性别字段用ENUM更规范)。
示例:status ENUM('active','inactive'),存“active”或“inactive”。
3. 集合类型(SET)¶
SET('A','B','C'):可从预设列表中选多个值(用逗号分隔),适合多选场景。
示例:permission SET('read','write','delete'),存“read,write”表示同时拥有读和写权限。
六、如何选择数据类型?¶
- 优先选最小类型:能用
TINYINT不用INT,节省空间(如年龄TINYINT UNSIGNED足够覆盖0-255岁)。 - 固定长度优先:短文本(如性别)用
CHAR,长文本(如内容)用TEXT。 - 根据业务场景:
- 手机号用VARCHAR(11)(INT存不下11位数字);
- 订单ID用INT或BIGINT(需避免溢出);
- 金额用DECIMAL(10,2)(避免浮点数误差)。 - 避免过度设计:ID用
INT足够时,别用BIGINT;状态字段用TINYINT(1)比ENUM更简单。 - 禁止NULL滥用:主键/唯一字段必须
NOT NULL,允许为空的字段用默认值(如年龄默认0)。
七、常见错误总结¶
- ❌ 用
INT存手机号(11位数字超过INT范围); - ❌ 用
CHAR(255)存长文本(浪费空间且效率低); - ❌ 用
DATE存当前时间(需用DATETIME或TIMESTAMP); - ❌ 用
VARCHAR存ID(INT查询更快,且更规范)。
结语¶
数据类型是MySQL的基础,选对类型能让表结构更合理、查询更快、数据更安全。新手可先从“整数+短文本+日期”三大类入手,熟练后再学习ENUM、SET等进阶类型。多实践、多观察生产环境的表结构,就能逐渐掌握类型选择的技巧。