1. MySQL数据类型全面解析
作为一名数据库开发工程师,我经常需要面对各种数据存储场景的选择。MySQL作为最流行的关系型数据库之一,其丰富的数据类型系统是数据库设计的基石。今天我将结合多年实战经验,详细剖析MySQL的常见数据类型,帮助大家在实际项目中做出更合理的选择。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整数类型:存储与性能的平衡术
2.1 整数类型详解
MySQL提供了5种整数类型,每种类型都有其特定的存储需求和适用范围:
| 类型名称 | 字节数 | 有符号范围 | 无符号范围 |
|---|---|---|---|
| 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 | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
| BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
实际项目经验:在电商系统中,用户ID建议使用BIGINT,即使当前数据量不大,也要考虑未来的扩展性。而像性别这种有限取值(0-2)的字段,使用TINYINT就足够了。
2.2 整数属性深度解析
显示宽度(M):这个特性经常被误解。int(6)中的6并不是存储限制,而是显示格式。只有当配合ZEROFILL使用时才有实际效果:
sql复制CREATE TABLE account (
id INT(6) ZEROFILL NOT NULL,
balance DECIMAL(10,2)
);
插入值123后查询会显示000123,但存储空间仍然是4字节。
UNSIGNED:当确定字段不会出现负值时,使用无符号类型可以扩大正数范围。例如:
sql复制CREATE TABLE user_age (
age TINYINT UNSIGNED -- 0~255范围
);
ZEROFILL:这是一个显示属性,会自动添加UNSIGNED约束。常用于需要固定格式显示的编号,如订单号:
sql复制CREATE TABLE orders (
order_no INT(8) ZEROFILL NOT NULL
);
`
