Mongodb 为什么在BSON字符串(而不是Cstring/ename)后的尾随0x00字节?

Mongodb 为什么在BSON字符串(而不是Cstring/ename)后的尾随0x00字节?,mongodb,bson,Mongodb,Bson,显然,对于bson cstring,后面的字节用于确定字符串的长度,因此:(byte*)“\x00”。它们被用作正则表达式模式、rexegs选项和ename,它们在迭代中不长/不使用,因此长度不是必需的,但随后 bson字符串写为:int32(字节*)“\x00” 规范如下:int32是(字节*)+1(对于尾随的“\x00”)中的字节数。(字节*)是零个或多个UTF-8编码字符。 但是为什么要使用尾随零字节呢?如果我们有utf-8编码的字符串长度,它就足以用于字节数据工作流,而0x00字节只是添

显然,对于bson cstring,后面的字节用于确定字符串的长度,因此:
(byte*)“\x00”
。它们被用作正则表达式模式、rexegs选项和ename,它们在迭代中不长/不使用,因此长度不是必需的,但随后

bson字符串写为:
int32(字节*)“\x00”

规范如下:
int32是(字节*)+1(对于尾随的“\x00”)中的字节数。(字节*)是零个或多个UTF-8编码字符。


但是为什么要使用尾随零字节呢?如果我们有utf-8编码的字符串长度,它就足以用于字节数据工作流,而0x00字节只是添加了一个不需要的字节。我遗漏了什么吗?

字符串长度和空终止符的原因有两个:与现有C样式字符串的兼容性和性能

为了提高性能,MongoDB需要能够快速转到文档中的特定字段,而无需遍历整个BSON。这一点非常重要,尤其是当您要查找的字段接近大型(比如16MB)文档的结尾时。当字符串的长度编码为字符串类型的第一个信息时,它可以跳过该字节数并进入下一个字段。否则,它将需要遍历整个字符串,直到找到字符串的结尾

兼容性,MangGDB是用C++编写的,其中字符串是。由于长度被编码,它可以切断空终止符来保存一个字节,但是将BSON中的字符串转换为C++所使用的格式将需要再次对空进行跟踪。这将需要专门的字符串处理例程,唯一的优点是节省一个字节


总的来说,“浪费”一个字节是可以接受的折衷办法。

好的,谢谢你的解释。可以在一天内赏金。