当我尝试将值插入firebird数据库时,我遇到了问题。我正在使用十六进制表示法将值插入表中。
我正在做这样的插入:
INSERT INTO ACCELEROMETER (PHYSICALID, XACCEL, YACCEL, ZACCEL, TIMEEPOCH,
TIMEOFFSET, TSTAMP)
VALUES (2, 0x12DF, 0x8000, 0x12, 0x45612, 0x0, current_timestamp);
当我尝试插入大于0x7FFF的值时,会出现问题。我知道所有firebird变量都是有符号的,所以每当我尝试插入一个像0x8000这样的值时,我应该得到一个值-32768,但我不断收到这条消息:
引擎代码:335544321引擎消息:
算术异常,数字溢出或字符串截断数字 值超出范围
看起来当我尝试插入0x8000时,firebird认为它是32768,这显然不起作用,因为它比SMALLINT字段允许的大。我的印象是,如果我插入十六进制值,firebird会看到最重要的位被设置,它会知道这是一个负值。我在这里遗漏了什么?
谢谢,
这是表格:
RECREATE TABLE accelerometer (
id int not null primary key,
physicalId int not null, -- foreign key physicalDevice table
xAccel SMALLINT,
yAccel SMALLINT,
zAccel SMALLINT,
timeEpoch BIGINT,
timeOffset INTEGER,
tStamp timeStamp -- time stamp generated by the firebird db at the time a record is entered
);
答案 0 :(得分:2)
Firebird会看到符号位,但不会看到 SMAILLINT 。在 0 .. 7FFFFFF 范围内,它将为正数且范围 80000000 ... FFFFFFFF 将为负数。范围中的值将为 INTEGER 。您可以添加零以强制值为 BIGINT 。但是没有任何线索表明它对 SMAILLINT 的行为相同。因此,值 0x8000 应为 32768 ,超出 SMALLINT 的边界。您可以参考here。