加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在PostgreSQL中将bytea表示为单个整数的最简单方法是什么?

发布时间:2020-12-13 16:13:08 所属栏目:百科 来源:网络整理
导读:我有一个包含14个字节数据的bytea列. 14的最后3个字节包含数据的CRC码.我想将CRC提取为一个整数,以存储在新列中. 我该怎么做呢? 为了澄清,这是在Java中实现它的一种方法: int crc = ((rawData[len - 3] 0xff) 16 | (rawData[len - 2] 0xff) 8 | (rawData[l
我有一个包含14个字节数据的bytea列. 14的最后3个字节包含数据的CRC码.我想将CRC提取为一个整数,以存储在新列中.

我该怎么做呢?

为了澄清,这是在Java中实现它的一种方法:

int crc = ((rawData[len - 3] & 0xff) << 16 |
            (rawData[len - 2] & 0xff) << 8 |
            (rawData[len - 1] & 0xff)) & 0xffffff;

我希望找到一个没有位移的解决方案,即类似于接受4个字节并将它们转换为整数的方法.

另一种方法是以十六进制表示形式提取最后6个字符,预先添加x并直接转换:
db=# SELECT ('x' || right('x00000000000001'::bytea::text,6))::bit(24)::int;
 int4
------
    1

..比get_byte()路由短一点,但也是PostgreSQL的一个未记录的功能.但是,我引用Tom Lane here:

This is relying on some undocumented behavior of the bit-type input
converter,but I see no reason to expect that would break. A possibly
bigger issue is that it requires PG >= 8.3 since there wasn’t a text
to bit cast before that.

这个相关答案的细节:

> Convert hex in text representation to decimal number

这假设您的bytea_output设置为十六进制,这是自9.0版以来的默认设置.当然,您可以为会话测试/设置它:

SET bytea_output = 'hex';

更多信息:

> PostgreSQL 9.X bytea representation in ‘hex’ or ‘escape’ for thumbnail images

性能

我在一个有10k行的桌子上进行了测试(最好的10个).在Postgres 9.1中,get_byte()实际上要快一点:

CREATE TEMP TABLE t (a bytea);
INSERT INTO t
SELECT (12345670000000 + generate_series(1,10000))::text::bytea;

比特移位与乘法/加法一样快:

SELECT 
 ('x' || right(a::text,6))::bit(24)::int                           -- 34.9 ms,(get_byte(a,11) << 16) + (get_byte(a,12) << 8) + get_byte(a,13) -- 27.0 ms,11) << 16) | (get_byte(a,12) << 8) | get_byte(a,13) -- 27.1 ms,get_byte(a,11) * 65536 + get_byte(a,12) * 256 + get_byte(a,13) -- 27.1 ms
FROM t

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读