c++ 使用OCCI在Oracle Database 11g中存储无符号64位整数的最佳方法

ca1c2owp  于 2023-10-20  发布在  Oracle
关注(0)|答案(5)|浏览(194)

我使用的是11.2版本,在表字段中没有直接支持uint64。你有什么建议做performacewise?它必须是主键。
谢谢

vddsk6oq

vddsk6oq1#

可能将其转换为char,然后将其作为char插入,并使用to_number将其转换为正确的格式?

z4iuyo4d

z4iuyo4d2#

我对Oracle一无所知,但MS SQL也有类似的问题,我最终将64位无符号整型存储在二进制(8)字段中。如果Oracle有类似的字段上限(我无法想象它没有),也许同样会为您工作。
SQL Server上的结果是二进制(n)字段与其他二进制(n)字段相比,有效地比较为字节数组,如果大小相同,这意味着它们也比较为big-endian表示(如果这是您存储它们的方式,并且您不这样做的话)。
抱歉,我不懂甲骨文。Gotta dance with the one that brings ya =)

cmssoen2

cmssoen23#

我使用RAW(8)数据类型,并将其写入:

uint64 i;
Bytes key((unsigned char*)&i, 8);
statement->setBytes(1, key);

快速和紧凑,似乎工作得很好。

tct7dpnv

tct7dpnv4#

您可以使用数字(20,0)作为64位整数,最大值为18,446,744,073,709,551,615。
使用数字类型也允许数学运算。

lb3vh1jj

lb3vh1jj5#

基于5.1.3.18一章中的Oracle® C++ Call Interface Programmers Guide中的信息
您不应该使用NUMBER作为外部数据类型。如果您确实使用它,Oracle将以其内部21字节二进制格式返回数值,并在输入时期望这种格式。以下讨论仅为完整起见。
Oracle以可变长度格式存储NUMBER数据类型的值。第一个字节是指数,后面是120尾数字节。指数字节的高位是符号位;它被设置为正数,而它被清除为负数。较低的7位表示指数,它是一个基数为100的数字,偏移量为65
要计算十进制指数,请将65与基数为100的指数相加,如果数字为正数,则再加上一个128。如果数字是负数,您也可以这样做,但随后位被反转。例如,-5有一个以100为底的指数= 62 (0x3e)。因此,十进制指数是(~0x3e)-128-65 = 0xc1-128-65 = 193-128-65 = 0
每个尾数字节是一个基数为100的数字,范围为1100。对于正数,数字加1。因此,值5的尾数是6。对于负数,不是加上1,而是从101中减去数字。因此,数字-5的尾数是:101-5 = 96。负数有一个字节包含102附加到数据字节。但是,尾数为20的负数没有尾字节102。由于尾数存储在基数-100中,因此每个字节可以表示两个十进制数字。尾数归一化;不存储前导零。
为了读/写64位整数,你应该调用getNumber().toBytes()/getNumber().fromBytes(),然后应用上面解释的逻辑。

相关问题