SQL字段类型怎么选_数据类型选型指南

4次阅读

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

SQL字段类型怎么选_数据类型选型指南

选SQL字段类型,核心是匹配数据本质、兼顾性能与可维护性。不盲目求大,也不为省空间牺牲精度。

数值类:看用途,分精度

整数范围明确(如用户ID、状态码)用 INTTINYINT;超大ID(分布式系统)考虑 BIGINT。金融金额必须用 DECIMAL(p,s),比如 DECIMAL(18,2) 覆盖百万级金额+两位小数;测量值(温度、体重)可用 Floatdouble,但别用于钱。

  • 避免用 INT 存手机号——它是数字但不参与计算,应转为 CHAR(11)NVARCHAR(11)
  • 状态、性别等枚举值推荐 TINYINT(0–255),比 VARCHAR 更省空间、查得快
  • 别写 DECIMAL(38,10) 图省事,按业务最大位数设,比如订单金额用 DECIMAL(12,2) 足够

字符串:定长 vs 可变,Unicode要留心

固定格式用 CHAR(如国家代码 CHAR(2)、性别 CHAR(1));长度波动大就选 VARCHARNVARCHAR。中文、多语言场景一律优先 NVARCHAR,哪怕当前只输英文——后期扩展不改结构。

  • 用户名、标题等建议 NVARCHAR(50),备注类字段用 NVARCHAR(255)NVARCHAR(MAX)
  • CHAR(n) 会补空格,比较时可能隐式截断或填充,容易出逻辑 bug
  • 别用 TEXT 类型——已过时,统一换 VARCHAR(MAX)NVARCHAR(MAX)

时间与布尔:选对类型,少踩坑

只要记录精确到秒或毫秒,用 DATETIME2(3)(SQL Server)或 timestampmysql);仅需日期(如生日、报表日)用 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)——数据库不是文件服务器
  • 地理坐标用 GEOGRAPHYGEOMETRY,别拆成两个 DECIMAL 字段,否则没法做距离计算和空间索引
text=ZqhQzanResources