目录
在数据库设计中,字段类型(数据类型)的选择至关重要。合理的数据类型不仅能提升查询性能,还能节省存储空间、减少数据异常。本文将以 SQL Server 为例,系统梳理常见数据类型及其应用场景,帮助你设计高质量数据库。
一、数值型数据
需求 | 推荐类型 | 说明 |
---|---|---|
整数(范围小,如状态码、性别) | TINYINT | 1字节,范围0~255 |
整数(一般性,如ID、自增主键) | INT | 4字节,范围 -2,147,483,648 ~ 2,147,483,647 |
超大整数(特殊场景) | BIGINT | 8字节,范围非常大 |
小数(精确到小数点后4位以内) | DECIMAL(p, s) / NUMERIC(p, s) | p = 总位数,s = 小数位数,金融数据推荐 |
小数(对精度要求不高,如测量值) | FLOAT / REAL | 浮点数,有精度误差 |
最佳实践:
金融金额/汇率 → DECIMAL(18,2)
体重/温度等测量值 → FLOAT
二、日期与时间数据
需求 | 推荐类型 | 说明 |
仅存储日期(年月日) | DATE | 只包含年月日,无时间 |
存储日期与时间(到秒) | DATETIME | 最常用日期时间类型,精度到0.003秒 |
存储日期与时间(到毫秒/更高精度) | DATETIME2 | 替代DATETIME,精度更高 |
仅存储时间(不含日期) | TIME | 只存储时分秒 |
仅存储年份+月份 | CHAR(7) / DATE(存01日) | 推荐用CHAR(7)存'YYYY-MM' |
最佳实践:
日志时间戳 → DATETIME2(3)
报表月份字段 → CHAR(7)
三、字符串与文本数据
需求 | 推荐类型 | 说明 |
固定长度短字符串(如手机号) | CHAR(n) | 长度固定,查询性能好 |
可变长度短字符串(如用户名、地址) | VARCHAR(n) | 变长节省空间 |
可变长度长文本(如备注、简介) | VARCHAR(MAX) | 可存储2GB,慎用,尽量避免过大文本 |
Unicode字符(需存中文、表情等) | NCHAR(n) / NVARCHAR(n) | 字符集为Unicode,存储中文必用 |
最佳实践:
手机号 → CHAR(11)
用户名 → NVARCHAR(50)
备注 → NVARCHAR(255)
四、布尔值与状态码
需求 | 推荐类型 | 说明 |
真/假(二元状态) | BIT | 0/1布尔值,占用1位 |
状态码(有枚举值,如1=启用,2=禁用) | TINYINT / SMALLINT | 枚举型状态字段 |
注意:SQL Server 无专门的 BOOLEAN 类型,用 BIT 替代。
五、二进制与文件数据
需求 | 推荐类型 | 说明 |
存储小图片、文件(<8KB) | VARBINARY(n) | 指定字节长度 |
存储大文件(图片、PDF、文档等) | VARBINARY(MAX) | 最多2GB文件,通常不推荐存大文件于数据库 |
最佳实践:文件/图片存储路径放数据库,文件本身存OSS/文件服务器。
六、唯一标识符(GUID)
需求 | 推荐类型 | 说明 |
全局唯一主键标识 | UNIQUEIDENTIFIER | 16字节GUID,适用于分布式主键 |
注意:GUID虽然唯一,但主键性能差,慎用作主键。
七、枚举与代码表设计
枚举(如性别、状态码)通常用 TINYINT 存储,定义与业务代码一致。
复杂枚举(带名称与描述) → 设计代码表(Code Table),用 ID 关联。
八、存储优化小结
数据类型 | 选型建议 |
能用 TINYINT 不用 INT | 节省空间 |
固定长度用 CHAR,变长用 VARCHAR | 频繁查询字段用 CHAR 性能更优 |
存中文必须用 NCHAR/NVARCHAR | 中文字符存储翻倍空间 |
文件与图片不推荐存数据库 | 存路径/URL即可 |
时间戳用 DATETIME2 替代 DATETIME | 精度高,存储空间更小 |
九、总结
SQL Server 数据库字段设计时,“数据类型”与“字段长度”影响着性能、存储与数据质量。字段类型选型的核心原则是:尽量精确匹配业务需求,避免过度设计与浪费空间,同时兼顾查询性能与后续扩展性。