2025-10-12 23:24:31 今天世界杯

以下是 MySQL 中常见字段数据类型的分类总结表,包含关键特性和使用场景建议:

一、数值类型

类型大小有符号范围无符号范围场景注意事项TINYINT1 Byte-128 ~ 1270 ~ 255状态码、布尔值(0/1)替代 BOOLEAN(实际是TINYINT别名)SMALLINT2 Bytes-32768 ~ 327670 ~ 65535小范围计数(如城市ID)MEDIUMINT3 Bytes-8388608 ~ 83886070 ~ 16777215中等范围IDINT4 Bytes-2147483648 ~ 21474836470 ~ 4294967295主键ID、计数器最常用整数类型BIGINT8 Bytes-2⁶³ ~ 2⁶³-10 ~ 2⁶⁴-1分布式ID、大数据计数可存雪花算法IDFLOAT4 Bytes约 ±3.4E+38(7位精度)-科学计算精度损失敏感场景避免使用DOUBLE8 Bytes约 ±1.8E+308(15位精度)-普通浮点数计算DECIMAL(M,D)变长(M+2)依赖 M(总位数)和 D(小数位)-精确计算(如金额)DECIMAL(10,2) = 总10位,小数2位

二、字符串类型

类型最大长度特点场景存储机制CHAR(N)255 字符定长,尾部空格移除固定长度(如MD5/UUID)始终分配 N 字符空间VARCHAR(N)65535 字节(实际受行大小限制)变长,存实际长度变长文本(用户名/地址)长度+1/2字节 + 数据TINYTEXT255 字节短文本备注、简介长度+1字节 + 数据TEXT64 KB中等文本文章内容、评论长度+2字节 + 数据MEDIUMTEXT16 MB长文本富文本、JSON数据长度+3字节 + 数据LONGTEXT4 GB超大文本小说、日志文件长度+4字节 + 数据BINARY(N)255 字节定长二进制加密Token类似 CHAR,存二进制VARBINARY(N)65535 字节变长二进制加密后的密码类似 VARCHAR

📌 字符集影响:

UTF8MB4(推荐)下,1字符占 4字节,VARCHAR(255) 最大实际存储约 63K 字符(受行大小65,535字节限制)

三、日期与时间类型

类型格式范围场景是否支持时区DATEYYYY-MM-DD1000-01-01 ~ 9999-12-31生日、过期日❌TIMEHH:MM:SS[.微秒]-838:59:59 ~ 838:59:59持续时间❌DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:59通用日期时间❌(按存入值存储)TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC自动更新的时间戳✅(转UTC存储,按会话时区返回)YEARYYYY1901 ~ 2155年份记录❌

⚠️ TIMESTAMP陷阱:

2038年问题(范围限制)时区转换可能造成显示差异(建议后端统一用 UTC 时间)

四、特殊类型

类型存储方式场景示例ENUM1~2 Bytes(索引值)固定选项值(如状态)ENUM('active','inactive','deleted')SET1~8 Bytes(位掩码)多选项组合(如权限)SET('read','write','execute')JSONLONGTEXT 格式半结构化数据(MySQL 5.7+){"name": "Alice", "age": 25}BOOLEANTINYINT(1) 别名真/假值true 存为 1,false 存为 0

五、选择建议与优化

整数类型

优先选 UNSIGNED(非负数场景)主键用 BIGINT UNSIGNED(适应未来扩展)

字符串类型

固定长度用 CHAR(如 CHAR(36) 存 UUID)变长文本用 VARCHAR,但避免过长(超 16383 字符用 TEXT)字符集统一为 utf8mb4(支持 Emoji 和生僻字)

时间类型

通用时间用 DATETIME需要自动更新或时区转换用 TIMESTAMP存储 UTC 时间(应用层处理时区转换)

精确计算

金额必须用 DECIMAL,禁止用 FLOAT/DOUBLE示例:DECIMAL(15,2)(最大 999,999,999,999.99)

JSON 类型优势

-- 直接查询JSON字段

SELECT * FROM users

WHERE JSON_EXTRACT(profile, '$.age') > 30;

支持部分更新(MySQL 8.0+)索引:JSON 字段可建虚拟列索引

六、避坑指南

ENUM/SET 慎用:修改选项需重建表,用关联表或 CHECK 约束替代BLOB/TEXT 分离:大字段单独存表,避免拖慢主表查询禁止 VARCHAR(65535):实际最大约 16383 字符(utf8mb4)TIMESTAMP 时区:确保数据库和应用的时区配置一致

💡 终极原则:

用最小合适类型 → 节省空间 + 提升索引效率

避免 NULL → 用默认值(如 '' 或 0)减少索引复杂度

根据业务场景选择合适类型,可显著提升性能和存储效率!