我使用的是11.2版本,在表字段中没有直接支持uint64。你有什么建议做performacewise?它必须是主键。谢谢
vddsk6oq1#
可能将其转换为char,然后将其作为char插入,并使用to_number将其转换为正确的格式?
z4iuyo4d2#
我对Oracle一无所知,但MS SQL也有类似的问题,我最终将64位无符号整型存储在二进制(8)字段中。如果Oracle有类似的字段上限(我无法想象它没有),也许同样会为您工作。SQL Server上的结果是二进制(n)字段与其他二进制(n)字段相比,有效地比较为字节数组,如果大小相同,这意味着它们也比较为big-endian表示(如果这是您存储它们的方式,并且您不这样做的话)。抱歉,我不懂甲骨文。Gotta dance with the one that brings ya =)
cmssoen23#
我使用RAW(8)数据类型,并将其写入:
uint64 i; Bytes key((unsigned char*)&i, 8); statement->setBytes(1, key);
快速和紧凑,似乎工作得很好。
tct7dpnv4#
您可以使用数字(20,0)作为64位整数,最大值为18,446,744,073,709,551,615。使用数字类型也允许数学运算。
lb3vh1jj5#
基于5.1.3.18一章中的Oracle® C++ Call Interface Programmers Guide中的信息您不应该使用NUMBER作为外部数据类型。如果您确实使用它,Oracle将以其内部21字节二进制格式返回数值,并在输入时期望这种格式。以下讨论仅为完整起见。Oracle以可变长度格式存储NUMBER数据类型的值。第一个字节是指数,后面是1到20尾数字节。指数字节的高位是符号位;它被设置为正数,而它被清除为负数。较低的7位表示指数,它是一个基数为100的数字,偏移量为65。要计算十进制指数,请将65与基数为100的指数相加,如果数字为正数,则再加上一个128。如果数字是负数,您也可以这样做,但随后位被反转。例如,-5有一个以100为底的指数= 62 (0x3e)。因此,十进制指数是(~0x3e)-128-65 = 0xc1-128-65 = 193-128-65 = 0。每个尾数字节是一个基数为100的数字,范围为1到100。对于正数,数字加1。因此,值5的尾数是6。对于负数,不是加上1,而是从101中减去数字。因此,数字-5的尾数是:101-5 = 96。负数有一个字节包含102附加到数据字节。但是,尾数为20的负数没有尾字节102。由于尾数存储在基数-100中,因此每个字节可以表示两个十进制数字。尾数归一化;不存储前导零。为了读/写64位整数,你应该调用getNumber().toBytes()/getNumber().fromBytes(),然后应用上面解释的逻辑。
NUMBER
21
1
20
7
100
65
128
-5
= 62 (0x3e)
(~0x3e)-128-65 = 0xc1-128-65 = 193-128-65 = 0
5
6
101
101-5 = 96
102
getNumber().toBytes()
getNumber().fromBytes()
5条答案
按热度按时间vddsk6oq1#
可能将其转换为char,然后将其作为char插入,并使用to_number将其转换为正确的格式?
z4iuyo4d2#
我对Oracle一无所知,但MS SQL也有类似的问题,我最终将64位无符号整型存储在二进制(8)字段中。如果Oracle有类似的字段上限(我无法想象它没有),也许同样会为您工作。
SQL Server上的结果是二进制(n)字段与其他二进制(n)字段相比,有效地比较为字节数组,如果大小相同,这意味着它们也比较为big-endian表示(如果这是您存储它们的方式,并且您不这样做的话)。
抱歉,我不懂甲骨文。Gotta dance with the one that brings ya =)
cmssoen23#
我使用RAW(8)数据类型,并将其写入:
快速和紧凑,似乎工作得很好。
tct7dpnv4#
您可以使用数字(20,0)作为64位整数,最大值为18,446,744,073,709,551,615。
使用数字类型也允许数学运算。
lb3vh1jj5#
基于5.1.3.18一章中的Oracle® C++ Call Interface Programmers Guide中的信息
您不应该使用
NUMBER
作为外部数据类型。如果您确实使用它,Oracle将以其内部21
字节二进制格式返回数值,并在输入时期望这种格式。以下讨论仅为完整起见。Oracle以可变长度格式存储
NUMBER
数据类型的值。第一个字节是指数,后面是1
到20
尾数字节。指数字节的高位是符号位;它被设置为正数,而它被清除为负数。较低的7
位表示指数,它是一个基数为100
的数字,偏移量为65
。要计算十进制指数,请将
65
与基数为100
的指数相加,如果数字为正数,则再加上一个128
。如果数字是负数,您也可以这样做,但随后位被反转。例如,-5
有一个以100
为底的指数= 62 (0x3e)
。因此,十进制指数是(~0x3e)-128-65 = 0xc1-128-65 = 193-128-65 = 0
。每个尾数字节是一个基数为
100
的数字,范围为1
到100
。对于正数,数字加1。因此,值5
的尾数是6
。对于负数,不是加上1
,而是从101
中减去数字。因此,数字-5
的尾数是:101-5 = 96
。负数有一个字节包含102
附加到数据字节。但是,尾数为20
的负数没有尾字节102
。由于尾数存储在基数-100
中,因此每个字节可以表示两个十进制数字。尾数归一化;不存储前导零。为了读/写64位整数,你应该调用
getNumber().toBytes()
/getNumber().fromBytes()
,然后应用上面解释的逻辑。