Firebird将十六进制值插入表中(算术异常)

时间:2013-08-02 22:16:16

标签: python sql firebird firebird2.5

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

1 个答案:

答案 0 :(得分:2)

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