gpt4 book ai didi

database - 字符串如何在数据库中存储为字节?

转载 作者:可可西里 更新时间:2023-11-01 11:14:08 30 4
gpt4 key购买 nike

这个问题可能有点模糊,但让我试着解释清楚。我一直在阅读与数据库相关的教程,它提到表被序列化为字节以保存在磁盘上。当我们反序列化它们时,我们可以根据其类型的大小来定位每一列。

比如我们有一张表:

---------------------------------------------------
| id (unsigned int 8) | timestamp (signed int 32) |
---------------------------------------------------
| Some Id | Some time |
---------------------------------------------------

当我们反序列化从文件加载的字节数组时,我们知道前 8 位是 id,接下来的 32 位是timestamp

但教程从未提及数据库中如何处理字符串。它们不特定于有限的大小,如 32 位,并且它们的大小是不可预测的(总是有一个很长的字符串,谁知道呢)。那么数据库究竟是如何处理字符串的呢?

我知道在 RDBMS 中,您需要将字符串的大小指定为 Varchar(45),例如,这样就变得更容易了。但是像 MongoDB 或 Redis 这样不需要字符串大小规范的数据库呢,他们是否只是假设它是一个特定的长度并在更长的长度出现时增加大小?

这基本上是我模糊的非特定问题,希望有人能给我一些想法。非常感谢

最佳答案

在 MongoDB 中,文档被序列化为 BSON(二进制 JSON 类对象)。参见 BSON spec有关每种类型的数据类型的更多详细信息。

对于字符串类型,存储为:

<unsigned32 strsizewithnull><cstring>

来自 this line in the MongoDB source .

因此,字符串字段及其长度(包括空终止符)存储在 BSON 对象中。字符串本身根据 BSON 规范采用 UTF-8 编码,因此可以使用每个符号的可变字节数对其进行编码。它们与构成文档的其他字段一起使用 Snappy by default 进行压缩.此压缩表示是持久保存到磁盘的表示。

WiredTiger 是一个无覆盖存储引擎。如果更新该文档,WiredTiger 会创建一个新文档并将内部指针更新为新文档,并将旧文档标记为“可重用空间”。

关于database - 字符串如何在数据库中存储为字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57617249/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com