🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 1.4 · 阅读时间:~8 分钟

数据类型定义了每个列可以存储的值的种类。在本课中,您将学习最常见的 SQL 数据类型,何时使用它们,以及如何通过正确的类型选择提高数据质量、存储效率和查询性能。

SQL 数据类型解释:INTEGER, VARCHAR, DATE 等

在上一课中,我们讨论了表、键、约束和 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
  • 使用时间类型存储日期和时间,而不是字符串。
  • 检查数据库特定的默认行为、时区处理和索引。

在设计时仔细选择数据类型可以减少未来的数据迁移工作、应用程序错误和性能回归。


本课的关键要点:

  • 数据类型定义了列可以存储的值,并强烈影响数据质量。
  • 数字类型服务于不同的目标:整数、精确小数和近似浮点值。
  • CHARVARCHARTEXT 应根据预期文本长度和存储行为进行选择。
  • 日期/时间字段应使用 DATETIMETIMESTAMP,而不是普通文本。
  • 早期选择正确的类型有助于避免后续的错误、数据清理和性能问题。

常见问题解答

DECIMAL 和 FLOAT 之间有什么区别?

DECIMAL 存储精确值,最适合货币。FLOAT 存储近似值,可能引入舍入差异,因此更适合科学计算。

我应该使用 CHAR 还是 VARCHAR 来存储名称和电子邮件?

在大多数情况下,使用 VARCHAR,因为名称和电子邮件的长度是可变的。CHAR 更适合固定长度的值,如国家代码。

NULL 是数据类型吗?

不是。NULL 表示缺失或未知的值。它不是单独的数据类型,而是可以出现在列中的特殊标记,具体取决于约束。

面试问题

您如何在 INTEGER、BIGINT 和 SMALLINT 之间进行选择?

估算预期值范围,并选择安全适合的最小类型。这可以提高存储效率,同时防止溢出。

为什么 DECIMAL 更适合货币值?

因为 DECIMAL 存储精确度,避免了可能导致财务不准确的浮点舍入错误。

当数据类型选择不当时会出现什么问题?

典型问题包括排序/过滤不正确、转换错误、存储浪费、查询变慢和应用程序逻辑不一致。

课程 1.4:理解 SQL 中的 NULL 值