SQL 数据类型是数据库表设计的核心,用于定义列的存储格式、取值范围和运算规则。不同数据库(MySQL、SQL Server、PostgreSQL)虽有方言差异,但核心类型分类一致。本文按数值型、字符串型、日期时间型、二进制型、特殊类型五大类梳理常用类型,并说明跨库差异与选型原则。
一、数值类型
用于存储数字,核心关注取值范围和精度,分为整数、浮点(近似值)、定点(精确值)三类。
1. 整数类型
存储无小数部分的数字,按字节数划分不同范围,需根据实际数值大小选择。
2. 浮点类型(近似值)
基于二进制存储小数,存在精度丢失,适用于对精度要求不高的场景(如身高、温度)。
3. 定点类型(精确值)
以字符串形式存储小数,无精度丢失,是金额、税率等高精度数值的首选。
二、字符串类型
用于存储文本数据,核心关注长度限制和存储效率,分为定长、变长、大文本三类。
1. 定长字符串:CHAR
- 语法:
CHAR(N),N 为字符数(MySQL 中 N 范围 1~255); - 特点:无论实际存储多少字符,均占用 N 个字符空间,查询速度快;
- 适用场景:短且长度固定的字符串(如手机号、身份证号、邮编)。
2. 变长字符串:VARCHAR
- 语法:
VARCHAR(N),N 为字符数; - 特点:仅占用实际字符数 + 1~2 字节的存储空间,节省空间;
- 适用场景:长度不固定的短字符串(如用户名、商品名称、地址)。
跨库差异:
- MySQL:
VARCHAR最大长度受行大小(65535 字节)限制; - SQL Server:
VARCHAR(N)为非 Unicode 字符,NVARCHAR(N)为 Unicode 字符(支持中文); - PostgreSQL:
VARCHAR(N)无性能损耗,也可直接用VARCHAR(无长度限制)。
3. 大文本类型
用于存储超长文本(如文章内容、商品详情),不同数据库的类型名称差异较大。
4. 特殊字符串类型
- 枚举类型
ENUM(MySQL 特有):存储预定义的枚举值,只能选其一,节省空间。 - 集合类型
SET(MySQL 特有):存储多个预定义值(最多 64 个),可多选。
三、日期时间类型
用于存储日期和时间,核心关注时间范围和精度,跨库差异较明显。
关键对比:
DATETIME:存储绝对时间,不受时区影响,范围大;TIMESTAMP:存储相对时间(从 1970-01-01 开始的秒数),受时区影响,范围小。
四、二进制类型
用于存储二进制数据(如图片、音频、序列化数据),不建议直接存储大文件(推荐存储文件路径)。
五、数据类型选型建议
- 最小化原则:选择能容纳数据的最小类型(如状态用
TINYINT而非INT),节省空间并提升查询效率。 - 金额必用定点数:
DECIMAL/NUMERIC是唯一选择,避免浮点数精度丢失。 - 字符串选型:
- 长度固定:用
CHAR(如手机号); - 长度可变且短:用
VARCHAR(如用户名); - 超长文本:用
TEXT/VARCHAR(MAX)(如文章)。
- 长度固定:用
- 日期时间选型:
- 记录创建 / 修改时间:MySQL 用
TIMESTAMP(自动更新),其他数据库用DATETIME2; - 仅存日期:用
DATE,避免冗余。
- 记录创建 / 修改时间:MySQL 用
- 二进制数据:尽量存储文件 URL(如云存储地址),而非直接存储二进制数据。
- 唯一标识:单库用自增
INT/BIGINT,分布式系统用UUID。
总结
SQL 数据类型的选择直接影响数据库的存储效率、查询性能和数据完整性。核心原则是匹配数据的实际特征:根据数值范围选数值类型,根据文本长度选字符串类型,根据时间精度选日期时间类型。同时需兼顾不同数据库的方言差异,确保表结构的可移植性。掌握常用类型的特性,是设计高效数据库表结构的基础。