在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”表示同时拥有读和写权限。

六、如何选择数据类型?

  1. 优先选最小类型:能用TINYINT不用INT,节省空间(如年龄TINYINT UNSIGNED足够覆盖0-255岁)。
  2. 固定长度优先:短文本(如性别)用CHAR,长文本(如内容)用TEXT
  3. 根据业务场景
    - 手机号用VARCHAR(11)INT存不下11位数字);
    - 订单ID用INTBIGINT(需避免溢出);
    - 金额用DECIMAL(10,2)(避免浮点数误差)。
  4. 避免过度设计:ID用INT足够时,别用BIGINT;状态字段用TINYINT(1)ENUM更简单。
  5. 禁止NULL滥用:主键/唯一字段必须NOT NULL,允许为空的字段用默认值(如年龄默认0)。

七、常见错误总结

  • ❌ 用INT存手机号(11位数字超过INT范围);
  • ❌ 用CHAR(255)存长文本(浪费空间且效率低);
  • ❌ 用DATE存当前时间(需用DATETIMETIMESTAMP);
  • ❌ 用VARCHAR存ID(INT查询更快,且更规范)。

结语

数据类型是MySQL的基础,选对类型能让表结构更合理、查询更快、数据更安全。新手可先从“整数+短文本+日期”三大类入手,熟练后再学习ENUMSET等进阶类型。多实践、多观察生产环境的表结构,就能逐渐掌握类型选择的技巧。

小夜