sql字段类型选择应匹配数据本质、兼顾性能与可维护性:数值用int/tinyint/bigint/decimal(金融必用);字符串优先nvarchar;时间用datetime2/date/datetimeoffset;布尔用bit/tinyint(1);guid慎作主键;json和地理类型按需使用。

选SQL字段类型,核心是匹配数据本质、兼顾性能与可维护性。不盲目求大,也不为省空间牺牲精度。
数值类:看用途,分精度
整数范围明确(如用户ID、状态码)用 INT 或 TINYINT;超大ID(分布式系统)考虑 BIGINT。金融金额必须用 DECIMAL(p,s),比如 DECIMAL(18,2) 覆盖百万级金额+两位小数;测量值(温度、体重)可用 FLOAT 或 DOUBLE,但别用于钱。
- 避免用
INT存手机号——它是数字但不参与计算,应转为CHAR(11)或NVARCHAR(11) - 状态、性别等枚举值推荐 TINYINT(0–255),比
VARCHAR更省空间、查得快 - 别写
DECIMAL(38,10)图省事,按业务最大位数设,比如订单金额用DECIMAL(12,2)足够
字符串:定长 vs 可变,Unicode要留心
固定格式用 CHAR(如国家代码 CHAR(2)、性别 CHAR(1));长度波动大就选 VARCHAR 或 NVARCHAR。中文、多语言场景一律优先 NVARCHAR,哪怕当前只输英文——后期扩展不改结构。
- 用户名、标题等建议
NVARCHAR(50),备注类字段用NVARCHAR(255)或NVARCHAR(MAX) -
CHAR(n)会补空格,比较时可能隐式截断或填充,容易出逻辑 bug - 别用
TEXT类型——已过时,统一换VARCHAR(MAX)或NVARCHAR(MAX)
时间与布尔:选对类型,少踩坑
只要记录精确到秒或毫秒,用 DATETIME2(3)(SQL Server)或 TIMESTAMP(MySQL);仅需日期(如生日、报表日)用 DATE。全球服务且涉及时区,必须用 DATETIMEOFFSET。
- 布尔值没有
BOOLEAN?SQL Server 用 BIT(存 0/1),MySQL 用TINYINT(1),语义上都可映射 true/false - 报表中“年月”字段(如 2026-03)建议用
CHAR(7),比DATE更直观、无时间干扰,也方便分区和索引 - 创建时间、更新时间字段加
DEFAULT GETDATE()或CURRENT_TIMESTAMP自动赋值
特殊与扩展:按需引入,不提前透支
GUID(UNIQUEIDENTIFIER)适合跨库唯一标识,但别直接当主键——随机写入导致页分裂,性能差;可用 NEWSEQUENTIALID() 缓解,或搭配 INT IDENTITY 做代理主键。
- JSON 配置字段用 JSON 类型(MySQL 5.7+/SQL Server 2016+),支持索引和路径查询,比存
NVARCHAR(MAX)更安全 - 图片、附件只存路径(
NVARCHAR(255)),文件本体放对象存储(OSS/S3)——数据库不是文件服务器 - 地理坐标用 GEOGRAPHY 或 GEOMETRY,别拆成两个
DECIMAL字段,否则没法做距离计算和空间索引










