SQL 数据类型详解:INTEGER、VARCHAR、DATE 等
第 1.4 课 · 阅读时间:约 8 分钟 · 练习题 ↓
数据类型决定了关系数据库中每一列可以存储哪种值。在本课中,你将学习最常用的 SQL 数据类型、各自的适用场景,以及正确选择类型如何提升数据质量、存储效率和查询性能。
在上一课中,我们介绍了表、键、约束和 ACID。现在来看每张表都要做的一项实际设计决策:为每一列选择合适的数据类型。

在深入了解各个子类型之前,先看 SQL 数据类型的主要分组:
- 数值类型:
TINYINT、INT、BIGINT、DECIMAL、FLOAT - 字符串类型:
CHAR、VARCHAR、TEXT - 日期时间类型:
DATE、TIME、DATETIME、TIMESTAMP - 特殊类型:
BOOLEAN、BLOB、JSON
SQL 中的数值类型有哪些?
数值类型用于存储数字,但并不是所有数字都应该用同一种方式存储。实际上,你需要在以下几类中选择:
- 用于整数的整数类型,
- 用于金额的精确小数类型,
- 用于近似科学数值的浮点类型。
INTEGER 系列
整数类型存储不带小数位的整数。
| 类型 | 常见大小 | 有符号时的大致范围 |
|---|---|---|
TINYINT | 1 字节 | -128 到 127 |
SMALLINT | 2 字节 | -32,768 到 32,767 |
INTEGER / INT | 4 字节 | -2,147,483,648 到 2,147,483,647 |
BIGINT | 8 字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
具体范围会因数据库以及是否支持有符号/无符号而略有不同。
DECIMAL / NUMERIC
DECIMAL 以固定精度存储精确值。
DECIMAL(p, s)的含义是:p= 数字的总位数,s= 小数点后的位数。
- 示例:
DECIMAL(10, 2)可以存储最大 99,999,999.99 的值。 - 最适合价格、发票、税额以及任何必须精确的值。
FLOAT / REAL / DOUBLE
浮点类型存储近似值。
- 适合科学计算和遥测数据。
- 不适合存储金额,因为二进制浮点数可能带来微小的舍入误差。
DOUBLE的精度通常高于FLOAT。
SQL 中的字符串类型有哪些?
文本类型的区别主要在于长度处理方式和存储策略。
CHAR
- 定长文本。
CHAR(10)总是为 10 个字符预留空间。- 如果值较短,许多数据库会用空格补齐。
- 适合固定长度的数据,例如 ISO 国家代码。
VARCHAR
- 有长度上限的变长文本。
VARCHAR(255)最多存储 255 个字符,但只占用实际需要的空间。- 是姓名、邮箱、标题和标签的理想默认选择。
TEXT
- 较长的变长文本。
- 适合较长的描述、文章正文、评论或日志。
- 其行为和索引限制可能因数据库系统而异。
日期和时间类型有哪些?
任何表示日期、时间或事件时间戳的值都应使用时间类型。
DATE
只存储年-月-日。
TIME
只存储时-分-秒。
DATETIME / TIMESTAMP
同时存储日期和时间。
在某些系统中,TIMESTAMP 会感知时区,而 DATETIME 通常与时区无关。在设计审计表或事件表之前,务必确认你所用 DBMS 的行为。
还应该了解哪些数据类型?
许多关系数据库还支持一些实用的特殊类型:
BOOLEAN:存储真/假值。BLOB:存储图片或文件等二进制内容。JSON:存储半结构化的 JSON 文档,通常还支持 JSON 函数和索引。
如何选择合适的数据类型?
可以使用这份实用的检查清单:
- 选择能够安全容纳预期值的最小类型。
- 金额使用
DECIMAL,不要用FLOAT存储财务数据。 - 除非数据长度确实固定,否则优先使用
VARCHAR而不是CHAR。 - 用时间类型存储日期和时间,而不是用字符串。
- 检查数据库在默认值、时区处理和索引方面的特有行为。
在设计阶段谨慎选择数据类型,可以减少日后的数据迁移工作、应用缺陷和性能下降。
本课要点:
- 数据类型决定一列可以存储哪些值,并对数据质量有很大影响。
- 不同数值类型服务于不同目标:整数、精确小数和近似浮点数。
- 应根据预期的文本长度和存储方式在
CHAR、VARCHAR和TEXT之间选择。 - 日期时间字段应使用
DATE、TIME或TIMESTAMP,而不是普通文本。 - 尽早选对类型,可以避免日后的缺陷、数据清理和性能问题。
常见问题
DECIMAL 和 FLOAT 有什么区别?
DECIMAL 存储精确值,最适合金额。FLOAT 存储近似值,可能产生舍入误差,因此更适合科学类计算。
姓名和邮箱应该用 CHAR 还是 VARCHAR?
大多数情况下使用 VARCHAR,因为姓名和邮箱的长度是可变的。CHAR 更适合国家代码这样的定长值。
NULL 是一种数据类型吗?
不是。NULL 表示缺失或未知的值。它不是一种单独的数据类型,而是一个特殊标记,是否能出现在列中取决于约束。
面试问题
如何在 INTEGER、BIGINT 和 SMALLINT 之间选择?
估算预期的取值范围,选择能够安全容纳它的最小类型。这样既能节省存储空间,又能防止溢出。
为什么存储金额时更推荐 DECIMAL?
因为 DECIMAL 以精确精度存储数值,能避免浮点舍入误差导致的财务不准确。
数据类型选得不好会带来哪些问题?
典型问题包括排序和过滤结果不正确、类型转换错误、存储空间浪费、查询变慢,以及应用逻辑不一致。