数据库中常见的8种数据类型具体都有哪些类型?

更新于
2026-08-13 17:09:54
11阅读来源:SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

在实际项目中,开发者常常因为不了解数据库的“到底该选哪种数据类型?”而遭遇以下痛点:

  • 数值字段存储超出范围导致溢出错误业务程序崩溃。
  • 字符字段长度设置不合理。出现数据截断或大量空闲空间,浪费存储并影响查询性能。老实说,
  • 对布尔、枚举等特殊类型缺乏认识。导致业务逻辑混乱代码可读性差。老实说,
  • 数组或对象字段使用不当。引发索引失效查询慢等性能瓶颈。说起来,

下面程序地梳理数据库中最常见的八大数据类型方便你定位需求、规避坑点、提高程序可靠性和性能。

数据库中常见的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

用于存放大段文字或文档,如产品描述、日志信息。 再看注意,这些列通常不支持普通索引。需要使用全文索引或外部搜索引擎来提高查询效率。

数据库中常见的8种数据类型具体都有哪些类型?

使用注意事项

  • 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` 实现类似数组查询。

**痛点**的观点是。直接在表中保存数组会破坏第一范式,引发更新难题和索引失效。仅在以下场景考虑使用:

  1. 子集合数量固定且不会单独检索,例如使用者偏好标签列表。老实说,
  2. 需要一次性写入大量同类数据且查询模式为整体读取。例如时间序列快照,

六、枚举类型

枚举提供一组预定义的离散取值,可明显提高代码可读性并防止非法数据写入。例如订单状态,其实,不同 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.

说到实际方法​,

  • - 在 JSON 中把经常过滤的属性抽取为虚拟列或生成表达式索引,实现行级过滤而不是全表扫描。不过,​/
  • - 对象层级深度超过 5 层时考虑拆分成关联表。以保持关系模型清晰并利用外键约束保证完整性。​/ sql -- MySQL 示例:为 json 列中的 status 创建虚拟列并建立普通索引 ALTER TABLE orders ADD COLUMN order_status VARCHAR AS )) VIRTUAL,ADD INDEX idx_order_status;​

    八、日期时间类型 ​

    日期时间是几乎所有业务程序必不可少的数据类别。不同 DBMS 提供了丰富的粒度选择:
类别      示例      备注      
DATE      #2024‑03‑15#      TIME       TDALIGN =“LEFT” TDALIGN =“LEFT” tr
DATETIME       TDALIGN =“LEFT” TDALIGN =“LEFT” tr
TIMESTAMP       TDALIGN ='LEFT' TDALIGN ='LEFT' tr
YEAR             TDALIGN=' LEFT'                        TDALIGN=' LEFT'                tr

/b/>


©2026 数据库技术社区 | 这篇文章基于公开资料整理,仅供学习参考

标签:种数

在实际项目中,开发者常常因为不了解数据库的“到底该选哪种数据类型?”而遭遇以下痛点:

  • 数值字段存储超出范围导致溢出错误业务程序崩溃。
  • 字符字段长度设置不合理。出现数据截断或大量空闲空间,浪费存储并影响查询性能。老实说,
  • 对布尔、枚举等特殊类型缺乏认识。导致业务逻辑混乱代码可读性差。老实说,
  • 数组或对象字段使用不当。引发索引失效查询慢等性能瓶颈。说起来,

下面程序地梳理数据库中最常见的八大数据类型方便你定位需求、规避坑点、提高程序可靠性和性能。

数据库中常见的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

用于存放大段文字或文档,如产品描述、日志信息。 再看注意,这些列通常不支持普通索引。需要使用全文索引或外部搜索引擎来提高查询效率。

数据库中常见的8种数据类型具体都有哪些类型?

使用注意事项

  • 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` 实现类似数组查询。

**痛点**的观点是。直接在表中保存数组会破坏第一范式,引发更新难题和索引失效。仅在以下场景考虑使用:

  1. 子集合数量固定且不会单独检索,例如使用者偏好标签列表。老实说,
  2. 需要一次性写入大量同类数据且查询模式为整体读取。例如时间序列快照,

六、枚举类型

枚举提供一组预定义的离散取值,可明显提高代码可读性并防止非法数据写入。例如订单状态,其实,不同 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.

说到实际方法​,

  • - 在 JSON 中把经常过滤的属性抽取为虚拟列或生成表达式索引,实现行级过滤而不是全表扫描。不过,​/
  • - 对象层级深度超过 5 层时考虑拆分成关联表。以保持关系模型清晰并利用外键约束保证完整性。​/ sql -- MySQL 示例:为 json 列中的 status 创建虚拟列并建立普通索引 ALTER TABLE orders ADD COLUMN order_status VARCHAR AS )) VIRTUAL,ADD INDEX idx_order_status;​

    八、日期时间类型 ​

    日期时间是几乎所有业务程序必不可少的数据类别。不同 DBMS 提供了丰富的粒度选择:
类别      示例      备注      
DATE      #2024‑03‑15#      TIME       TDALIGN =“LEFT” TDALIGN =“LEFT” tr
DATETIME       TDALIGN =“LEFT” TDALIGN =“LEFT” tr
TIMESTAMP       TDALIGN ='LEFT' TDALIGN ='LEFT' tr
YEAR             TDALIGN=' LEFT'                        TDALIGN=' LEFT'                tr

/b/>


©2026 数据库技术社区 | 这篇文章基于公开资料整理,仅供学习参考

标签:种数