0

当我尝试将值插入 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
);
4

1 回答 1

2

Firebird 会看到符号位,但不会看到SMAILLINT。在0 .. 7FFFFFF范围内它将是正数,在80000000 .. FFFFFFFF范围内它将是负数。该范围内的值将是INTEGER。您可以在前面添加零以强制该值为BIGINT。但没有任何线索表明它对SMAILLINT的行为相同。所以值0x8000应该是32768并且超出SMALLINT的边界。你可以参考这里

于 2013-08-02T22:39:49.937 回答