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