⏳ 十月只剩最后几天!SQLtest.online 依靠捐款免费运营,我们仍需达成本月目标,才能让网站在十一月继续运行。每一份捐款都很重要。 立即支持 →
SQL 代码已复制到剪贴板

SQL 数据类型详解:INTEGER、VARCHAR、DATE 等

第 1.4 课 · 阅读时间:约 8 分钟 · 练习题 ↓

数据类型决定了关系数据库中每一列可以存储哪种值。在本课中,你将学习最常用的 SQL 数据类型、各自的适用场景,以及正确选择类型如何提升数据质量、存储效率和查询性能。

在上一课中,我们介绍了表、键、约束和 ACID。现在来看每张表都要做的一项实际设计决策:为每一列选择合适的数据类型。

设计表的列时使用的 SQL 数值、文本和日期时间数据类型对比

在深入了解各个子类型之前,先看 SQL 数据类型的主要分组:

  • 数值类型:TINYINT、INT、BIGINT、DECIMAL、FLOAT
  • 字符串类型:CHAR、VARCHAR、TEXT
  • 日期时间类型:DATE、TIME、DATETIME、TIMESTAMP
  • 特殊类型:BOOLEAN、BLOB、JSON

SQL 中的数值类型有哪些?

数值类型用于存储数字,但并不是所有数字都应该用同一种方式存储。实际上,你需要在以下几类中选择:

  • 用于整数的整数类型,
  • 用于金额的精确小数类型,
  • 用于近似科学数值的浮点类型。

INTEGER 系列

整数类型存储不带小数位的整数。

类型常见大小有符号时的大致范围
TINYINT1 字节-128 到 127
SMALLINT2 字节-32,768 到 32,767
INTEGER / INT4 字节-2,147,483,648 到 2,147,483,647
BIGINT8 字节-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 以精确精度存储数值,能避免浮点舍入误差导致的财务不准确。

数据类型选得不好会带来哪些问题?

典型问题包括排序和过滤结果不正确、类型转换错误、存储空间浪费、查询变慢,以及应用逻辑不一致。

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 金额应该用什么类型?