📊 MySQL 数据类型
MySQL 支持多种数据类型,分为数值类型、字符串类型、日期时间类型和 JSON 类型等。选择合适的数据类型对于数据库性能和存储效率至关重要。
🔄 MySQL 5.7 vs 8.x 数据类型差异
- 默认字符集:MySQL 8.x 默认使用 utf8mb4,MySQL 5.7 默认使用 latin1
- JSON 增强:MySQL 8.x 提供了更多 JSON 函数和操作符
- 几何类型:MySQL 8.x 对空间数据类型有更好的支持
- 新增函数:MySQL 8.x 新增了窗口函数相关的数据处理能力
🔢 数值类型
整数类型
类型 |
字节 |
有符号范围 |
无符号范围 |
用途 |
TINYINT |
1 |
-128 到 127 |
0 到 255 |
布尔值、状态码 |
SMALLINT |
2 |
-32,768 到 32,767 |
0 到 65,535 |
年龄、数量 |
MEDIUMINT |
3 |
-8,388,608 到 8,388,607 |
0 到 16,777,215 |
中等范围计数 |
INT/INTEGER |
4 |
-2,147,483,648 到 2,147,483,647 |
0 到 4,294,967,295 |
主键、外键 |
BIGINT |
8 |
-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
0 到 18,446,744,073,709,551,615 |
大数值、时间戳 |
-- 整数类型示例
CREATE TABLE number_examples (
id INT AUTO_INCREMENT PRIMARY KEY,
age TINYINT UNSIGNED, -- 年龄 (0-255)
quantity SMALLINT, -- 数量
user_id INT UNSIGNED, -- 用户ID
timestamp_val BIGINT, -- 时间戳
is_active BOOLEAN -- 布尔值 (TINYINT(1) 的别名)
);
浮点和定点类型
类型 |
字节 |
精度 |
用途 |
FLOAT |
4 |
单精度浮点 |
科学计算 |
DOUBLE |
8 |
双精度浮点 |
高精度计算 |
DECIMAL(M,D) |
变长 |
精确小数 |
金融、货币 |
-- 浮点类型示例
CREATE TABLE financial_data (
id INT AUTO_INCREMENT PRIMARY KEY,
price DECIMAL(10,2), -- 价格,精确到分
weight FLOAT, -- 重量
coordinates DOUBLE, -- 坐标
percentage DECIMAL(5,2) -- 百分比 (999.99%)
);
📝 字符串类型
类型 |
最大长度 |
存储需求 |
用途 |
CHAR(M) |
255 字符 |
M 字节 |
固定长度字符串 |
VARCHAR(M) |
65,535 字符 |
L+1 或 L+2 字节 |
可变长度字符串 |
TEXT |
65,535 字符 |
L+2 字节 |
长文本 |
MEDIUMTEXT |
16,777,215 字符 |
L+3 字节 |
中等长度文本 |
LONGTEXT |
4,294,967,295 字符 |
L+4 字节 |
超长文本 |
MySQL 8.x 字符集改进
MySQL 8.x 默认字符集为 utf8mb4
,完全支持 Unicode,包括 emoji 表情符号。
-- 字符串类型示例
CREATE TABLE content_table (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL, -- 用户名
email VARCHAR(100) NOT NULL, -- 邮箱
status CHAR(1) DEFAULT 'A', -- 状态码
title VARCHAR(200), -- 标题
content TEXT, -- 内容
description MEDIUMTEXT, -- 描述
full_content LONGTEXT -- 完整内容
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
二进制类型
类型 |
最大长度 |
用途 |
BINARY(M) |
255 字节 |
固定长度二进制 |
VARBINARY(M) |
65,535 字节 |
可变长度二进制 |
BLOB |
65,535 字节 |
二进制大对象 |
MEDIUMBLOB |
16,777,215 字节 |
中等二进制对象 |
LONGBLOB |
4,294,967,295 字节 |
大型二进制对象 |
📅 日期时间类型
类型 |
格式 |
范围 |
用途 |
DATE |
YYYY-MM-DD |
1000-01-01 到 9999-12-31 |
日期 |
TIME |
HH:MM:SS |
-838:59:59 到 838:59:59 |
时间 |
DATETIME |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 到 9999-12-31 23:59:59 |
日期时间 |
TIMESTAMP |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:01 到 2038-01-19 03:14:07 |
时间戳 |
YEAR |
YYYY |
1901 到 2155 |
年份 |
-- 日期时间类型示例
CREATE TABLE event_table (
id INT AUTO_INCREMENT PRIMARY KEY,
event_date DATE, -- 事件日期
event_time TIME, -- 事件时间
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
birth_year YEAR -- 出生年份
);
-- 插入示例数据
INSERT INTO event_table (event_date, event_time, birth_year)
VALUES ('2024-01-15', '14:30:00', 1990);
🎯 特殊类型
JSON 类型(MySQL 5.7+)
MySQL 8.x JSON 增强功能
- 更多 JSON 函数:JSON_TABLE(), JSON_ARRAYAGG(), JSON_OBJECTAGG()
- JSON 路径表达式增强
- 更好的 JSON 索引支持
-- JSON 类型示例
CREATE TABLE user_profiles (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
profile JSON, -- JSON 数据
settings JSON
);
-- 插入 JSON 数据
INSERT INTO user_profiles (username, profile, settings) VALUES
('john_doe',
'{"age": 30, "city": "Beijing", "hobbies": ["reading", "coding"]}',
'{"theme": "dark", "notifications": true, "language": "zh-CN"}'
);
-- 查询 JSON 数据 (MySQL 5.7+)
SELECT username,
JSON_EXTRACT(profile, '$.age') as age,
JSON_EXTRACT(profile, '$.city') as city
FROM user_profiles;
-- MySQL 8.x 简化语法
SELECT username,
profile->>'$.age' as age,
profile->>'$.city' as city
FROM user_profiles;
ENUM 和 SET 类型
-- ENUM 和 SET 类型示例
CREATE TABLE user_preferences (
id INT AUTO_INCREMENT PRIMARY KEY,
status ENUM('active', 'inactive', 'pending') DEFAULT 'pending', -- 枚举
permissions SET('read', 'write', 'delete', 'admin'), -- 集合
priority ENUM('low', 'medium', 'high') DEFAULT 'medium'
);
-- 插入数据
INSERT INTO user_preferences (status, permissions, priority) VALUES
('active', 'read,write', 'high'),
('pending', 'read', 'low');
💡 数据类型选择建议
- 整数类型:根据数值范围选择最小的类型,节省存储空间
- 字符串类型:固定长度用 CHAR,可变长度用 VARCHAR
- 文本类型:短文本用 VARCHAR,长文本用 TEXT
- 小数类型:精确计算用 DECIMAL,科学计算用 FLOAT/DOUBLE
- 日期时间:需要时区转换用 TIMESTAMP,否则用 DATETIME
- JSON 类型:存储结构化数据,但注意查询性能
⚠️ 版本兼容性注意事项
- 字符集:从 MySQL 5.7 升级到 8.x 时注意字符集变化
- JSON 函数:某些 JSON 函数仅在 MySQL 8.x 中可用
- 默认值:MySQL 8.x 对默认值的处理更严格
- SQL 模式:MySQL 8.x 默认启用更严格的 SQL 模式