在 SQL(关系型数据库,如 MySQL、PostgreSQL、SQL Server、Oracle 等)中,数据类型的选择直接影响性能、存储空间、数据准确性和可维护性。下面从「选择原则 → 常见类型对比 → 实际场景示例」三个层面讲清楚。
够用就好(最小原则)
INT 就不要用 BIGINTVARCHAR(50) 就不要用 VARCHAR(255)避免隐式转换
VARCHAR 存优先考虑索引效率
INT、DATE、CHAR)通常比变长类型更高效明确业务含义
DECIMALTINYINT 或 ENUM| 类型 | 范围 | 建议 |
|---|---|---|
| TINYINT | 0~255 | 状态、布尔 |
| SMALLINT | ±3万 | 小范围计数 |
| INT | ±21亿 | 用户ID、计数 |
| BIGINT | 极大 | 分布式ID |
✅ 示例:
age TINYINT
user_id BIGINT
❌ 错误:
price FLOAT
✅ 正确:
price DECIMAL(10,2)
浮点有精度误差,钱必须 DECIMAL
| 类型 | 特点 | 使用场景 |
|---|---|---|
| CHAR(n) | 定长 | 手机号、MD5 |
| VARCHAR(n) | 变长 | 姓名、地址 |
| TEXT | 大文本 | 文章、日志 |
✅ 示例:
phone CHAR(11)
username VARCHAR(50)
content TEXT
| 类型 | 用途 |
|---|---|
| DATE | 生日 |
| DATETIME | 下单时间 |
| TIMESTAMP | 自动更新时间 |
✅ 示例:
created_at TIMESTAMP
birthday DATE
多数数据库:
is_deleted TINYINT(1)
或 PostgreSQL:
is_active BOOLEAN
status ENUM('pending','done')
⚠ 缺点:
✅ 更推荐:
status TINYINT COMMENT '1待处理 2完成'
CREATE TABLE user (
id BIGINT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
age TINYINT,
phone CHAR(11),
balance DECIMAL(10,2),
created_at DATETIME
);
❌ 用 VARCHAR 存时间
❌ 用 FLOAT 存金额
❌ 一味用 VARCHAR(255)
❌ ID 用 INT 但数据会超
如果你愿意,可以告诉我:
我可以直接帮你设计表结构 + 字段类型。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。