MySQL数据类型选择指南:从数值到JSON
MySQL数据类型全面解析:从数值到JSON的精确选择
MySQL提供了丰富的数据类型系统,合理选择数据类型对数据库性能、存储空间和数据准确性至关重要。本文将深入解析MySQL支持的各种数据类型,帮助您做出最佳选择。
一、数值类型
1. 整数类型
MySQL支持5种主要整数类型,每种类型有不同的存储范围和空间需求:
类型 | 字节 | 有符号范围 | 无符号范围 | 适用场景 |
---|---|---|---|---|
TINYINT | 1 | -128~127 | 0~255 | 状态标志、年龄 |
SMALLINT | 2 | -32768~32767 | 0~65535 | 中等范围ID、年份 |
MEDIUMINT | 3 | -8388608~8388607 | 0~16777215 | 较大ID、计数器 |
INT | 4 | -2147483648~2147483647 | 0~4294967295 | 标准整数、主键 |
BIGINT | 8 | -2^63~2^63-1 | 0~2^64-1 | 极大整数、自增主键 |
实践建议:
- 优先选择能满足需求的最小类型
- 自增主键推荐使用无符号INT或BIGINT
- 对于布尔值,使用TINYINT(1)而非BIT/BOOLEAN
2. 浮点类型
浮点类型用于存储近似数值,适合科学计算但可能有精度问题:
-- 浮点类型示例
CREATE TABLE scientific_data (
temp FLOAT, -- 单精度,约7位有效数字
pressure DOUBLE -- 双精度,约15位有效数字
);
3. 定点数类型(DECIMAL)
DECIMAL用于存储精确小数,适合财务数据:
-- DECIMAL示例
CREATE TABLE financial_records (
id INT,
amount DECIMAL(10,2) -- 共10位,2位小数
);
INSERT INTO financial_records VALUES (1, 12345678.99);
实践建议:
- 金额计算必须使用DECIMAL
- 合理设置精度和小数位数,避免过度分配空间
- DECIMAL(10,2)适合大多数货币场景
二、字符串类型
1. CHAR与VARCHAR
特性 | CHAR | VARCHAR |
---|---|---|
存储方式 | 固定长度 | 可变长度 |
空间效率 | 低(总是占用定义长度) | 高(只占用实际长度+1-2字节) |
适用场景 | 长度固定的数据(MD5/UUID) | 长度变化大的数据(用户名/地址) |
-- CHAR与VARCHAR示例
CREATE TABLE user_profiles (
user_id CHAR(36), -- UUID固定36字符
username VARCHAR(50), -- 用户名长度可变
bio VARCHAR(500) -- 可变长度描述
);
2. TEXT类型系列
类型 | 最大长度 | 适用场景 |
---|---|---|
TINYTEXT | 255字节 | 短文本摘要 |
TEXT | 65,535字节 | 文章内容、评论 |
MEDIUMTEXT | 16,777,215字节 | 较大文档、JSON数据 |
LONGTEXT | 4,294,967,295字节 | 超大文本、日志数据 |
实践建议:
- 超过5000字符考虑使用TEXT类型
- TEXT列不能有默认值
- 避免在WHERE子句中对TEXT列进行全匹配
3. BINARY与BLOB类型
二进制类型用于存储非文本数据:
-- 二进制类型示例
CREATE TABLE file_storage (
file_id INT,
file_name VARCHAR(100),
file_data MEDIUMBLOB, -- 二进制文件内容
file_hash BINARY(32) -- SHA-256哈希值
);
4. ENUM与SET
特殊字符串类型,适合有限选项:
-- ENUM与SET示例
CREATE TABLE survey_responses (
user_id INT,
gender ENUM('Male', 'Female', 'Other'), -- 单选
hobbies SET('Reading', 'Sports', 'Music', 'Travel') -- 多选
);
实践建议:
- ENUM适合不超过20个选项的单选场景
- SET适合多选但选项有限的情况
- 选项频繁变化时考虑使用关联表代替
三、日期时间类型
MySQL提供5种日期时间类型:
gantt
title 日期时间类型范围比较
dateFormat YYYY-MM-DD
section 范围
YEAR : 1901, 2155
DATE : 1000-01-01, 9999-12-31
TIME : -838:59:59, 838:59:59
DATETIME : 1000-01-01 00:00:00, 9999-12-31 23:59:59
TIMESTAMP : 1970-01-01 00:00:01, 2038-01-19 03:14:07
实践建议:
- 记录创建/更新时间使用TIMESTAMP(自动更新特性)
- 历史日期使用DATETIME(范围更大)
- 只需要日期时使用DATE而非DATETIME
- 时区敏感数据考虑使用TIMESTAMP WITH TIME ZONE(MySQL 8.0+)
四、JSON类型(MySQL 5.7+)
JSON类型提供了灵活的半结构化数据存储:
-- JSON类型示例
CREATE TABLE product_catalog (
id INT,
details JSON,
attributes JSON
);
INSERT INTO product_catalog VALUES (1,
'{"name": "Laptop", "price": 999.99, "specs": {"cpu": "i7", "ram": "16GB"}}',
'["warranty", "in_stock"]'
);
-- JSON查询
SELECT
id,
details->"$.name" AS product_name,
JSON_EXTRACT(details, "$.specs.cpu") AS cpu_type
FROM product_catalog
WHERE details->"$.price" > 500;
JSON函数速查:
JSON_EXTRACT()
/->
:提取值JSON_SET()
:设置值JSON_OBJECT()
:创建JSON对象JSON_ARRAY()
:创建JSON数组JSON_CONTAINS()
:检查包含关系
实践建议:
- 复杂嵌套数据适合使用JSON
- 需要索引的字段应提取为独立列
- JSON列不宜过大(考虑使用LONGTEXT存储超大JSON)
- MySQL 8.0提供了JSON性能改进和更多函数
五、数据类型选择最佳实践
- 存储效率:选择能满足需求的最小类型
- 查询性能:为常用查询条件选择合适类型
- 数据完整性:使用约束和合适类型确保数据有效
- 未来扩展:考虑业务增长可能带来的需求变化
- 特殊需求:时区、精度、字符集等特殊要求
通过合理选择数据类型,您可以优化MySQL数据库的性能、可靠性和存储效率。每种类型都有其适用场景,理解它们的特性和限制是设计高效数据库的关键。