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

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


一、数值类型

类型大小有符号范围无符号范围场景注意事项
TINYINT1 Byte-128 ~ 1270 ~ 255状态码、布尔值(0/1)替代 BOOLEAN(实际是TINYINT别名)
SMALLINT2 Bytes-32768 ~ 327670 ~ 65535小范围计数(如城市ID)
MEDIUMINT3 Bytes-8388608 ~ 83886070 ~ 16777215中等范围ID
INT4 Bytes-2147483648 ~ 21474836470 ~ 4294967295主键ID、计数器最常用整数类型
BIGINT8 Bytes-2⁶³ ~ 2⁶³-10 ~ 2⁶⁴-1分布式ID、大数据计数可存雪花算法ID
FLOAT4 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 存为 1false 存为 0

五、选择建议与优化

  1. 整数类型

    • 优先选 UNSIGNED(非负数场景)
    • 主键用 BIGINT UNSIGNED(适应未来扩展)
  2. 字符串类型

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

    • 通用时间用 DATETIME
    • 需要自动更新或时区转换用 TIMESTAMP
    • 存储 UTC 时间(应用层处理时区转换)
  4. 精确计算

    • 金额必须用 DECIMAL,禁止用 FLOAT/DOUBLE
    • 示例:DECIMAL(15,2)(最大 999,999,999,999.99)
  5. 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)减少索引复杂度

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值