众所周知(请参阅此处的答案),当使用MapReduce查询时,Couchbase将二进制数据作为base64编码的文档提供.但是,它也将它存储为base64吗?从libcouchbase的角度来看,它需要一个字节数组+长度,它会在以后转换为base64吗?
Couchbase存储引擎在内部精确存储您的数据(即您指定的长度的字节流).在协议级别使用CRUD键/值API读取该数据时,您将获得完全相同的字节流.
这是可能的,因为低级键值协议在线路上是二进制的,因此每字节使用所有8位都没有问题.
不同的客户端SDK将以不同的方式向您公开.例如:
C SDK(低级别)直接为您提供char*
缓冲区和length
.
Python SDK提供了转码功能,其中使用文档元数据中的标志来编码文档的类型,因此它可以自动将其转换为原始类型,例如Python序列化对象或JSON对象.
另一方面,Views API通过HTTP与JSON响应对象完成.JSON 不能直接编码8位二进制数据,因此如果视图响应对象包含二进制数据,则Couchbase需要使用base64编码.
(顺便说一句,这是为什么建议索引emit
所需的最小数据量的原因之一,例如只需要感兴趣的文档的密钥,然后使用CRUD键/值接口实际获取文档 - Key/Value接口在传回数据时没有base64开销.