课程 1.4 · 阅读时间:~8 分钟
数据类型定义了每个列可以存储的值的种类。在本课中,您将学习最常见的 SQL 数据类型,何时使用它们,以及如何通过正确的类型选择提高数据质量、存储效率和查询性能。
SQL 数据类型解释:INTEGER, VARCHAR, DATE 等
在上一课中,我们讨论了表、键、约束和 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 存储精确度,避免了可能导致财务不准确的浮点舍入错误。
当数据类型选择不当时会出现什么问题?
典型问题包括排序/过滤不正确、转换错误、存储浪费、查询变慢和应用程序逻辑不一致。