数据库中常见的8种数据类型具体都有哪些类型?
- 内容介绍
- 文章标签
- 相关推荐
在实际项目中,开发者常常因为不了解数据库的“到底该选哪种数据类型?”而遭遇以下痛点:
- 数值字段存储超出范围导致溢出错误业务程序崩溃。
- 字符字段长度设置不合理。出现数据截断或大量空闲空间,浪费存储并影响查询性能。老实说,
- 对布尔、枚举等特殊类型缺乏认识。导致业务逻辑混乱代码可读性差。老实说,
- 数组或对象字段使用不当。引发索引失效查询慢等性能瓶颈。说起来,
下面程序地梳理数据库中最常见的八大数据类型方便你定位需求、规避坑点、提高程序可靠性和性能。
一、整数类型
用于存储不带小数点的数值,是最常用的主键或计数字段。选择合适的字节长度可以避免“整数溢出”。按理说,
- TINYINT-128~127或 0~255。适合状态码、性别标识等极小范围。
- SMALLINT-32 768~32 767,适合年龄、短期计数。
- MIDINT / MEDIUMINT-8 388 608~8 388 607,适合中等规模 ID。
- INT / INTEGER-2 147 483 648~2 147 483 647,最常用的使用者 ID、订单号等。
- BIGINT-9.22×10¹⁸~9.22×10¹⁸,适用于全局唯一 ID 或金融交易累计额。
常见坑点与方法
- Pitfall:将业务可能超过 2⁹⁹ 的计数直接定义为 INT → 溢出异常。话说回来,
- Solution:预估最大值后选用 BIGINT;若仅需正数,可使用 UNSIGNED 降低存储空间。
二、浮点与定点类型
用于存储带小数点的数值。需要根据“精度 vs. 范围" 的取舍来选型。
1. 浮点数
- FLOAT约 7 位有效数字。适合科学计算或对精度要求不高的场景,如传感器读数。
- DOUBLE约 15 位有效数字。用于更高精度需求,如统计分析。
- REAL部分数据库实现略有差异。
2. 定点数——DECIMAL / NUMERIC
- DECIMAL/NUMERIC: M 为总位数,D 为小数位。典型如 DECIMAL 用于金额,确保四舍五入后仍保持准确。
- MONEY / SMALLMONEY: 部分 DBMS 提供专用货币类型,但底层仍是定点实现。说起来,
坑点
- Pitfall:使用 FLOAT 存储金钱会出现不可预期的四舍五入误差。话说回来,
- Solve:对财务相关字段统一使用 DECIMAL。并设定恰当的 scale 与 precision。
三、字符与字符串类型
1. 固定长度字符 – CHAR
每条记录均占用 n 个字节,不足部分以空格填充。适用于长度固定且经常比较的列,如国家代码 )、邮编 )。
2. 可变长度字符 – VARCHAR
仅占实际字符长度加上少量元数据。是最常用的文本存储方式,可灵活应对不同长度的数据。例如使用者名、电子邮件地址等。
3. 大文本 – TEXT / MEDIUMTEXT / LONGTEXT
用于存放大段文字或文档,如产品描述、日志信息。 再看注意,这些列通常不支持普通索引。需要使用全文索引或外部搜索引擎来提高查询效率。
使用注意事项
- Pitfall:TINYTEXT/TEXT 等大文本列未设索引导致模糊搜索极慢。
四、布尔类型
布尔字段只表示真/假两种状态。在业务规则判断和标记位上非常略有差异:
- TINYINT: MySQL 常用实现,把 0 当作 FALSE,其余为 TRUE;按理说,
- **BIT** : SQL Server 与 PostgreSQL 原生布尔;
- **BOOLEAN** 或 **BOOL** : PostgreSQL 完全支持;
- **BOOL** : SQLite 将其映射为整数 0/1。
**常用方法**:尽量使用原生 BOOLEAN 类型;若只能使用 TINYINT,请显式声明为 UNSIGNED 并加 CHECK ) 保证数据完整性。按理说,
常见误区
- **Pitfall** :把布尔列设计成 CHAR 或 VARCHAR。占用更多空间且容易产生大小写不一致的问题。
- **Solution** :统一采用 BOOLEAN 或 BIT,并在 ORM 层映射为 true/false 布尔对象。
五、数组类型
数组在关系型数据库里并非标准,但部分程序提供原生支持。用于一次性保存同类元素集合:
- **PostgreSQL**:`INTEGER` 、 `TEXT` 等,可直接通过 `ANY` 、 `UNNEST` 等函数展开查询。
- **MySQL 8+**:通过 `JSON` 存储数组结构,再配合 `JSON_TABLE` 实现类似数组查询。
**痛点**的观点是。直接在表中保存数组会破坏第一范式,引发更新难题和索引失效。仅在以下场景考虑使用:
- 子集合数量固定且不会单独检索,例如使用者偏好标签列表。老实说,
- 需要一次性写入大量同类数据且查询模式为整体读取。例如时间序列快照,
六、枚举类型
枚举提供一组预定义的离散取值,可明显提高代码可读性并防止非法数据写入。例如订单状态,其实,不同 DBMS 支持情况如下:
- **MySQL ENUM**:内部以整数存储。对比时速度快,但修改枚举值需要 ALTER 表。
- **PostgreSQL ENUM**:创建自定义 enum 类型后可像普通列一样使用,并支持后续 `ALTER TYPE ... ADD VALUE` 动态添加新成员。
- **SQL Server**:没有原生 ENUM,只能通过 CHECK 约束或 lookup 表实现相同效果。
Pitfall:If you rely on ENUM and later need to add a new value without downtime。you may face migration headaches in MySQL.
推荐做法
- 对于频繁变动的业务状态,优先采用独立 lookup 表 + 外键约束,而不是 ENUM。
- 若枚举项几乎固定且数量极少。可直接使用 MySQL/PG 的原生 ENUM,以获得更紧凑存储和快速比较优势。
七、类/对象类型
现代应用越来越倾向于把复杂结构直接保存在一列中,这时 JSON/BLOB 类型成为首选:
| DBMS | 列类型 | 特点 | |
|---|---|---|---|
| MySQL | `JSON`
原生校验 JSON 合法性;提供 `->` 、 `JSON_EXTRACT` 等函数;可建虚拟列索引,<\/td> | PostgreSQL | `JSONB` | 二进制压缩存储,高效键方法检索;支持 GIN 索引,<\/td> | `NVARCHAR` or `VARBINARY`<\/code> | `CLOB`/`BLOB`+ `IS_JSON` 检查
Pain point:If you store large JSON blobs without indexing frequently queried keys。queries become full‑table scans. 说到实际方法,
|
/b/>
©2026 数据库技术社区 | 这篇文章基于公开资料整理,仅供学习参考
。在实际项目中,开发者常常因为不了解数据库的“到底该选哪种数据类型?”而遭遇以下痛点:
- 数值字段存储超出范围导致溢出错误业务程序崩溃。
- 字符字段长度设置不合理。出现数据截断或大量空闲空间,浪费存储并影响查询性能。老实说,
- 对布尔、枚举等特殊类型缺乏认识。导致业务逻辑混乱代码可读性差。老实说,
- 数组或对象字段使用不当。引发索引失效查询慢等性能瓶颈。说起来,
下面程序地梳理数据库中最常见的八大数据类型方便你定位需求、规避坑点、提高程序可靠性和性能。
一、整数类型
用于存储不带小数点的数值,是最常用的主键或计数字段。选择合适的字节长度可以避免“整数溢出”。按理说,
- TINYINT-128~127或 0~255。适合状态码、性别标识等极小范围。
- SMALLINT-32 768~32 767,适合年龄、短期计数。
- MIDINT / MEDIUMINT-8 388 608~8 388 607,适合中等规模 ID。
- INT / INTEGER-2 147 483 648~2 147 483 647,最常用的使用者 ID、订单号等。
- BIGINT-9.22×10¹⁸~9.22×10¹⁸,适用于全局唯一 ID 或金融交易累计额。
常见坑点与方法
- Pitfall:将业务可能超过 2⁹⁹ 的计数直接定义为 INT → 溢出异常。话说回来,
- Solution:预估最大值后选用 BIGINT;若仅需正数,可使用 UNSIGNED 降低存储空间。
二、浮点与定点类型
用于存储带小数点的数值。需要根据“精度 vs. 范围" 的取舍来选型。
1. 浮点数
- FLOAT约 7 位有效数字。适合科学计算或对精度要求不高的场景,如传感器读数。
- DOUBLE约 15 位有效数字。用于更高精度需求,如统计分析。
- REAL部分数据库实现略有差异。
2. 定点数——DECIMAL / NUMERIC
- DECIMAL/NUMERIC: M 为总位数,D 为小数位。典型如 DECIMAL 用于金额,确保四舍五入后仍保持准确。
- MONEY / SMALLMONEY: 部分 DBMS 提供专用货币类型,但底层仍是定点实现。说起来,
坑点
- Pitfall:使用 FLOAT 存储金钱会出现不可预期的四舍五入误差。话说回来,
- Solve:对财务相关字段统一使用 DECIMAL。并设定恰当的 scale 与 precision。
三、字符与字符串类型
1. 固定长度字符 – CHAR
每条记录均占用 n 个字节,不足部分以空格填充。适用于长度固定且经常比较的列,如国家代码 )、邮编 )。
2. 可变长度字符 – VARCHAR
仅占实际字符长度加上少量元数据。是最常用的文本存储方式,可灵活应对不同长度的数据。例如使用者名、电子邮件地址等。
3. 大文本 – TEXT / MEDIUMTEXT / LONGTEXT
用于存放大段文字或文档,如产品描述、日志信息。 再看注意,这些列通常不支持普通索引。需要使用全文索引或外部搜索引擎来提高查询效率。
使用注意事项
- Pitfall:TINYTEXT/TEXT 等大文本列未设索引导致模糊搜索极慢。
四、布尔类型
布尔字段只表示真/假两种状态。在业务规则判断和标记位上非常略有差异:
- TINYINT: MySQL 常用实现,把 0 当作 FALSE,其余为 TRUE;按理说,
- **BIT** : SQL Server 与 PostgreSQL 原生布尔;
- **BOOLEAN** 或 **BOOL** : PostgreSQL 完全支持;
- **BOOL** : SQLite 将其映射为整数 0/1。
**常用方法**:尽量使用原生 BOOLEAN 类型;若只能使用 TINYINT,请显式声明为 UNSIGNED 并加 CHECK ) 保证数据完整性。按理说,
常见误区
- **Pitfall** :把布尔列设计成 CHAR 或 VARCHAR。占用更多空间且容易产生大小写不一致的问题。
- **Solution** :统一采用 BOOLEAN 或 BIT,并在 ORM 层映射为 true/false 布尔对象。
五、数组类型
数组在关系型数据库里并非标准,但部分程序提供原生支持。用于一次性保存同类元素集合:
- **PostgreSQL**:`INTEGER` 、 `TEXT` 等,可直接通过 `ANY` 、 `UNNEST` 等函数展开查询。
- **MySQL 8+**:通过 `JSON` 存储数组结构,再配合 `JSON_TABLE` 实现类似数组查询。
**痛点**的观点是。直接在表中保存数组会破坏第一范式,引发更新难题和索引失效。仅在以下场景考虑使用:
- 子集合数量固定且不会单独检索,例如使用者偏好标签列表。老实说,
- 需要一次性写入大量同类数据且查询模式为整体读取。例如时间序列快照,
六、枚举类型
枚举提供一组预定义的离散取值,可明显提高代码可读性并防止非法数据写入。例如订单状态,其实,不同 DBMS 支持情况如下:
- **MySQL ENUM**:内部以整数存储。对比时速度快,但修改枚举值需要 ALTER 表。
- **PostgreSQL ENUM**:创建自定义 enum 类型后可像普通列一样使用,并支持后续 `ALTER TYPE ... ADD VALUE` 动态添加新成员。
- **SQL Server**:没有原生 ENUM,只能通过 CHECK 约束或 lookup 表实现相同效果。
Pitfall:If you rely on ENUM and later need to add a new value without downtime。you may face migration headaches in MySQL.
推荐做法
- 对于频繁变动的业务状态,优先采用独立 lookup 表 + 外键约束,而不是 ENUM。
- 若枚举项几乎固定且数量极少。可直接使用 MySQL/PG 的原生 ENUM,以获得更紧凑存储和快速比较优势。
七、类/对象类型
现代应用越来越倾向于把复杂结构直接保存在一列中,这时 JSON/BLOB 类型成为首选:
| DBMS | 列类型 | 特点 | |
|---|---|---|---|
| MySQL | `JSON`
原生校验 JSON 合法性;提供 `->` 、 `JSON_EXTRACT` 等函数;可建虚拟列索引,<\/td> | PostgreSQL | `JSONB` | 二进制压缩存储,高效键方法检索;支持 GIN 索引,<\/td> | `NVARCHAR` or `VARBINARY`<\/code> | `CLOB`/`BLOB`+ `IS_JSON` 检查
Pain point:If you store large JSON blobs without indexing frequently queried keys。queries become full‑table scans. 说到实际方法,
|
/b/>
©2026 数据库技术社区 | 这篇文章基于公开资料整理,仅供学习参考
。
