SQL 中的数据类型

可用

SQL 数据类型简介

与 JavaScript 不同,SQL 具有强类型。在每个表中,每一列都有自己固定的数据类型。

数据类型有很多,但是和Java语言不同的是,之所以有这么多,并不是因为有适用于所有场合的数据类型。数据库非常依赖于数据的大小,因此许多数据类型仅在长度上有所不同。

总的来说,数据类型可以分为 5 组:

  • 数值类型
  • 字符串类型
  • 存储日期时间的类型
  • 对象:通常表示为字节集合
  • 传输:JSON 和 XML

通常不同的 DBMS 仍然有自己的数据类型。每个 DBMS 都有自己的专长,因此添加新的数据类型是很常见的事情。

另一件事是仅仅添加一个新的数据类型是不够的,你需要添加将与其一起工作的函数,并且使这项工作方便快捷。

如果您在任何工业(企业)DBMS 上工作,那么很可能您将不得不处理它的数据类型和功能。有必要阅读 2-5 本好书。

作为熟悉 SQL 的一部分,我们将考虑三组主要的数据类型:

  • 数字
  • 字符串
  • 日期

SQL 中的数值类型

在 SQL 中,数字类型分为三组:

  • 整数类型
  • 定点数(固定小数位数)
  • 浮点数字

让我们从整数开始。它们只有5个,可以用一张表来描述:

# 类型名称 字节长度 来自 Java 的模拟 最小值 最大值
1个 微信 1个 字节 -128 127
2个 小情报 2个 短的 -32.768 32.767
3个 媒体 3个 -8,388,608 8,388,607
4个 情报局 4个 整数 -2,147,483,648 2,147,483,647
5个 大数据 8个 长的 -2 63 2 63-1

数据类型与 Java 数据类型非常相似,但还有一种长度为三个字节的整数类型。这样做是为了节省尺寸。

接下来是浮点类型,就像在 Java 中一样,只有两个:

# 类型名称 字节长度 来自 Java 的模拟 最小值 最大值
1个 漂浮 4个 漂浮 -3.40E+38 +1.18E+38
2个 双倍的 8个 双倍的 -1.79E+308 +1.79E+308

同样,没有什么新鲜事。一切都和 Java 一样。然而,与 Java 不同的是,SQL 有另一种特殊类型,即定点实数。它叫做十进制。

通常这种类型用于存储金额。当写入该类型的名称时,通常在其后表示该数字在小数点前后有多少位小数。一般格式如下所示:

DECIMAL(total_characters, after_comma)

还有一个小例子:

salary DECIMAL(5,2)

这就是我们如何描述工资列可以包含整数(最多 3 位小数)和小数部分 - 2 位小数这一事实。

DECIMAL 类型支持的最大字符数是 65。

SQL 中的字符串类型

数据库中的行可以以两种形式存储:

  • 定长字符串
  • 可变长度的字符串

固定长度的字符串被指定为CHAR

CHAR(length)

固定长度意味着该列的所有值将包含严格固定数量的字符。

固定长度字符串的示例:

country_code CHAR(2)

可变长度字符串由VARCHAR类型指定:

VARCHAR(max_length)

可变长度意味着该列的所有值将包含任意长度的文本,但不超过最大长度。

可变长度字符串示例:

phone VARCHAR(12)

固定长度的字符串有一个非常大的优势。如果客户端要求 SQL Server 返回表中的第 1,000,000 行,并且表中的行是固定长度的,那么,知道行的长度,就可以很容易地计算出与所需的字节相关的字节数排。

在行长度可变的情况下,将无法在表中快速找到所需的行。记住访问ArrayList和LinkedList的速度,这里的情况大致相同。

让我们比较不同长度的字符串如何根据数据类型存储在表中。

线 字符(4) 要存储的字节 变量(4) 要存储的字节
'' ' ' 4个 '' 1个
'ab' 'ab' 4个 'ab' 3个
'A B C D' 'A B C D' 4个 'A B C D' 5个
'abcdefgh' 'A B C D' 4个 'A B C D' 5个

笔记。VARCHAR 类型对于相同的长度需要多一个字节,因为它必须额外存储字符串的长度。

SQL 中的临时类型

SQL 还有用于存储日期和时间的特殊类型。一共有五种类型:

# 类型名称 来自 Java DateTime API 的模拟 例子 最小值 最大值
1个 日期 本地日期 '2022-06-30' '1000-01-01' '9999-12-31'
2个 时间 当地时间 'hh:mm:ss[.分数]' '-838:59:59.000000' '838:59:59.000000'
3个 约会时间 本地日期时间 '1000-01-01 00:00:00.000000' '9999-12-31 23:59:59.999999'
4个 时间戳 日期 '1970-01-01 00:00:01.000000' '2038-01-19 03:14:07.999999'
5个 1901年 2155

查询中的所有数据都写成字符串 - 用单引号括起来。条目格式从大到小:

  • 小时
  • 分钟
  • 第二
  • 一秒的分数

DATE、TIME 和 DATETIME 类型通常被认为是 Java DateTme API 中类型的类似物:LocalDate、LocalTime、LocalDateTime。逻辑大致相同。

TIMESTAMP 类型以毫秒为单位存储自 1970 年初以来的数据(UNIX 操作系统标准)。Java语言中的Date类型就是以这种形式存储的。

最后是 YEAR 类型,它是 1 个字节长,存储 1 到 255 之间的值。因此,它可用的年份范围是 1901-2155。这种类型不能存储 1900 年,因为值 0 用于编码 NULL 值。

在 SQL 中存储对象

有一些特殊类型可以存储很长的对象或文本。我们不会详细介绍它们,但无论如何我都会列出它们:

# 类型名称 解释
1个 文本 用于存储长文本。对该字段进行比较和排序时,仅使用前 100 个字符。
2个 BLOB 该名称代表字节大对象。仅存储为字节集合。例如,可用于将图片存储在数据库中。
3个 CLOB 该名称代表 Char Large Object。用于存储长文本。
4个 枚举 允许您设置一组固定的值并将其中一个值存储为一个值。
5个 允许您设置一组固定的值并将它们的任何子集存储为一个值。通常将它们存储为二进制掩码。

理论上,您可以将任何 Java 对象序列化为一组字节,并将其作为 BLOB 存储在数据库中。保存对象不是问题。如何与他进一步合作?

假设一个表以序列化形式存储了一百万个对象——您将如何搜索它们?当 DBMS 提供了一组广泛的功能来处理它时,它只支持某种类型的数据。

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论