MySQL 数据类型选型宝典:从原理到实战,打造高性能数据库设计的基石

时间:2025-09-20 18:20

MySQL有哪些数据类型?MySQL 数据类型是数据库设计中非常基础和重要的概念,选择合适的数据类型对于优化存储空间、提升查询性能和数据准确性都至关重要。

MySQL 数据类型主要分为三大类:数值类型、字符串(文本)类型、日期/时间类型。此外,还有两种现代且常用的特殊类型。

一、 数值类型

数值类型用于存储数字,分为整数类型和浮点数(小数)类型。

  1. 整数类型 整数类型可选 UNSIGNED 属性,表示无符号(仅非负数),这样可以使正数的范围扩大一倍。

类型

大小

有符号范围 (SIGNED)

无符号范围 (UNSIGNED)

用途

TINYINT

1 byte

(-128, 127)

(0, 255)

小范围数值,如状态码 (0, 1)、年龄

SMALLINT

2 bytes

(-32,768, 32,767)

(0, 65,535)

较小范围数值

MEDIUMINT

3 bytes

(-8,388,608, 8,388,607)

(0, 16,777,215)

中等范围数值

INT

4 bytes

(-2,147,483,648, 2,147,483,647)

(0, 4,294,967,295)

标准的整数,常用。如用户ID、数量

BIGINT

8 bytes

(±9.22e+18)

(0, 18,446,744,073,709,551,615)

大范围数值,如大数据量、金融交易号

最佳实践:选择类型时,在满足需求的前提下尽可能使用最小的数据类型。例如,age 字段用 TINYINT UNSIGNED 就足够了。

  1. 浮点数类型 (近似值) 用于存储近似值的小数,计算时可能会有精度损失。

类型

大小

用途

FLOAT(M, D)

4 bytes

单精度浮点数。M 是总位数,D 是小数点后的位数。

DOUBLE(M, D)

8 bytes

双精度浮点数。精度比 FLOAT 更高。

  1. 定点数类型 (精确值) 用于存储精确的小数值,如财务数据、货币计算。

类型

大小

用途

DECIMAL(M, D)

变长

精确的小数。M 是总位数(精度,最大65),D 是小数点后的位数(标度,最大30)。例如 DECIMAL(10, 2) 可以存储 12345678.12。

FLOAT/DOUBLE vs DECIMAL:追求性能(计算速度)用 FLOAT/DOUBLE,追求精确性(无舍入误差)用 DECIMAL。

二、 字符串类型

字符串类型用于存储文本、二进制数据(如图片、文件)等。

  1. 短文本与二进制字符串

类型

大小

用途

CHAR(N)

0 - 255 bytes

定长字符串。无论实际内容多少,都会占用 N 个字符定义的长度。适合存储长度几乎固定的数据,如MD5哈希值(32)、国家代码(2)、UUID(36)。存取速度比 VARCHAR 快。

VARCHAR(N)

0 - 65,535 bytes

变长字符串。只用必要的空间来存储字符串(+1或+2字节用来记录长度)。适合存储长度变化较大的数据,如姓名、地址、文章标题。N 是字符的最大数量。

BINARY(N)

0 - 255 bytes

类似 CHAR,但存储的是二进制字节串,而非字符串。

VARBINARY(N)

0 - 65,535 bytes

类似 VARCHAR,但存储的是二进制字节串。

CHAR vs VARCHAR:长度固定用 CHAR,长度变化大用 VARCHAR。

  1. 长文本与二进制字符串 (BLOB & TEXT) 这些类型用于存储大型数据。BLOB 系列存储二进制数据,TEXT 系列存储字符文本数据。

类型

大小

用途

TINYTEXT / TINYBLOB

最大 255 bytes

短文本或二进制数据

TEXT / BLOB

最大 64 KB

文本内容(如长文章、日志)或二进制数据(如图片、PDF小文件)

MEDIUMTEXT / MEDIUMBLOB

最大 16 MB

更大的文本或二进制数据

LONGTEXT / LONGBLOB

最大 4 GB

极大的文本或二进制数据

注意:通常不建议将大型文件直接存入数据库,而是将文件存储在文件系统或对象存储(如AWS S3)中,然后在数据库中只保存文件的路径或URL。

三、 日期与时间类型

类型

格式

范围

用途

DATE

YYYY-MM-DD

1000-01-01 to 9999-12-31

仅存储日期,如生日、创建日期。

TIME

HH:MM:SS[.fraction]

-838:59:59.000000 to 838:59:59.000000

存储时间或时间间隔。

DATETIME

YYYY-MM-DD HH:MM:SS[.fraction]

1000-01-01 00:00:00 to 9999-12-31 23:59:59

存储日期和时间。与时区无关,显示的值与写入的值一致。

TIMESTAMP

YYYY-MM-DD HH:MM:SS[.fraction]

1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC

存储时间戳(从’1970-01-01’开始的秒数)。与时区有关,存入和查询时会根据会话时区进行转换。占用4字节,比 DATETIME(8字节)更省空间。但有 2038年问题。

YEAR

YYYY

1901 to 2155

存储年份值。

DATETIME vs TIMESTAMP: 需要范围更大、与时区无关,用 DATETIME。 需要自动记录行更新时间、节省空间、与时区相关,用 TIMESTAMP。常定义为 UPDATE CURRENT_TIMESTAMP。

四、 特殊类型

  1. JSON 类型 (MySQL 5.7.8+) 用于存储 JSON 格式的数据,MySQL 提供了自动验证 JSON 格式和一系列便捷的 JSON 查询函数。

CREATE TABLE user ( id INT, profile JSON -- 存储用户的JSON配置信息 ); INSERT INTO user VALUES (1, '{"name": "John", "hobbies": ["reading", "coding"]}');

  1. 空间数据类型 (GIS) 用于存储地理信息数据,如点、线、多边形等。例如 GEOMETRY, POINT, POLYGON。

总结与选择建议

  1. 更小通常更好:在满足需求的前提下,选择占用空间最小的数据类型。它们通常更快,占用更少的磁盘和内存。
  2. 简单就好:整型比字符操作更简单。例如,用 INT 存储 IP 地址不如用MySQL提供的 INET_ATON() 和 INET_NTOA() 函数将其转换为无符号整型存储。
  3. 避免使用 NULL:尽量定义字段为 NOT NULL。除非必要,因为可为 NULL 的列使索引和值处理更复杂,且占用更多空间。
  4. 字符集选择:对于中文等非拉丁字符,通常使用 utf8mb4 字符集(真正完整的UTF-8支持,utf8 在MySQL中并非完整的UTF-8)。

示例表结构:

CREATE TABLE `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 无符号自增主键 `username` VARCHAR(50) NOT NULL UNIQUE, -- 变长用户名 `age` TINYINT UNSIGNED NULL, -- 小范围无符号年龄 `balance` DECIMAL(10, 2) NOT NULL DEFAULT '0.00', -- 精确的账户余额 `avatar_url` VARCHAR(255) NULL, -- 存储头像链接,而非图片本身 `status` ENUM('active', 'inactive', 'banned') NOT NULL DEFAULT 'active', -- 枚举状态 `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 自动记录创建时间 `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 自动更新 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。

 

MySQL处理中文排序,除了拼音还能怎么办?一文掌握拼音与笔画排序的所有奥秘
一小时速通MySQL:零基础入门到精通,看这篇就够了(下篇)
一小时速通MySQL:零基础入门到精通,看这篇就够了(上篇)
MySQL小白下载指南 (以 Windows 为例)
MySQL安装太难?看完这篇就够了!小白专属下载安装指南
MySQL清空表数据,你用DELETE还是TRUNCATE?一文讲清两者核心差异与正确使用场景
从查询崩溃到丝滑流畅:详解MySQL性能优化的核心路径与高频实战技巧
MySQL性能优化漫谈:从金字塔法则到避坑指南,一位老DBA的架构思维与实践总结
千万级数据何去何从?一文读懂MySQL分库分表面试与工程实践的核心要点
mysql2,用于与 MySQL 数据库进行交互