CodeGym /课程 /SQL & Hibernate /SQL 中的数据类型

SQL 中的数据类型

SQL & Hibernate
第 4 级 , 课程 0
可用

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 提供了一组广泛的功能来处理它时,它只支持某种类型的数据。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION