Big Endian字节与字符串作为字符串 - 字符串数据库中的键

问题描述:

我还没有看到将整数转换为网络顺序并将结果字节写入字符串中的可索引实体的常识概念 - 字符串数据库vs.在这些数据库的文档中的任何地方写入数字的字符串表示。Big Endian字节与字符串作为字符串 - 字符串数据库中的键

当然,将64位int作为字符串写入数据库的大小开销必须超过在将字节写回整数类型之前必须执行ntohl调用的微不足道的复杂性。

因此我在这里丢失了一些东西,在字符串字符串数据库中使用big-endian字节与字符串作为可索引实体的缺点是什么? (我正在讨论将字节写入程序类型的BDDB,因为这是我使用的数据库,可能也是kyotodb)的C++/C标记。

在这种情况下,big-endian的优点是字符串按升序正确排序。

如果数据库体系结构本身不能存储64位整数,但仍然需要存储它们,以这种方式对它们进行字符串化是一种方法。

当然,如果您稍后将数据库升级到本地可以存储64位整数的数据库,您可能会被“卡住”该实现或必须经历一个迁移过程。

+0

我会阅读你说的话。如果架构没有兼容的本机数据类型。但是像'boost :: lexical_cast (std :: string)'应该仍然可以。我想这样的转换在某些老派硬件上可能证明过于昂贵。 – 2012-01-11 14:53:54

+0

转换这些值不可能是一个非常昂贵的操作。 (虽然boost :: lexical_cast不太可能成为最佳的方法,但如果您正在转换大量这样的结果,例如一个大的结果集,可能会给您带来性能问题)。 – CashCow 2012-01-11 17:00:53

+0

我认为我们都认为按升序排列顺序以及大小和速度的改进是很好忽略的。 :D有问题的数据库技术(BDB专用)确实只能在其“recno”模式下使用32位整数(也许这就是你的本意)。如果你编辑你的答案要有点自信(例如,如果数据库没有本地类型作为可索引值使用,那么嵌入到字符串中的大端整数字节比字符串表示更好),我会接受它:D 。 – 2012-01-12 18:53:03

如果数据库验证您发送的字符串数据在预期的编码中有效,那么您不能只给它任何您想要的数据。你只能发送这样的整数,看起来像是一个有效的编码。我不知道BDB或kyotodb是否做了这种验证。

另外,在我看来,它似乎试图欺骗一种数据类型来保存其他东西,然后依靠客户端都知道这个伎俩。当然,无论您是使用字符串来保存整数的ASCII十进制表示形式,还是将该字符串用作原始内存缓冲区来保存整数,这都适用。在我看来,最好使用一个实际上拥有你想要保存的类型的数据库,而不仅仅是字符串。