поле bytea
Есть таблица
create table testtable( col bytea[5])
Так-же у меня есть 2 переменные типа smallint
a smallint, b smallint
Я хочу вставить в таблицу данные в виде двоичного формата
Только вот даже не знаю, как правильно это сформулировать
Объясню на примере:
a = 3 (0x0003)
b = 1 (0x0001)
-- Добавляем нули впереди, чтобы видно было ограничение smallint
insert into testtable( col ) values ( <Что тут писать> ? );
Чтобы вставилось следующее:
0x00 00 03 00 01 -- отделю байты пробелами, чтобы было понятней
т.е. в 1-0 байты записываем значение b, в 3-2 байты - a, 4 байт оставляем 0
Понимаю, что надо использовать &, но только как правильно ?
Yaroslav не подскажешь тут?
INSERT INTO testtable(col) VALUES (decode('aaabbbfff', 'hex'))
так а как слить 2 переменные smallint в одну последовательность байт ?
А вот это не знаю)
Это не поле bytea, это массив из пяти bytea. Что Вам на самом деле нужно?
Уточнение: текущая реализация не ограничивает размер массивов. Поэтому 5 в bytea[5] - это так, для документации.
Суть вот в чём была таблица логирования create table .... ( a smallint, b smallint, c smallint); Но все эти переменные имеют значения 0..100 ) Что в принципе может помещаться в 1 байт Вот и мы хотим 3 2-байтовых числа запихнуть в колонку с 3-мя байтами
не обязательно bytea[5] мне нужна реализация, описанная сообщением выше
Вы с клиента хотите это сделать?
нет, именно в БД, в функциях на pl/psql
Ну так, например (если я правильно понял): SELECT set_byte('x', 0, 1) || set_byte('x', 0, 2) || set_byte('x', 0, 3); > не обязательно bytea[5] Это массив из пяти bytea (условно, как выше написали), каждое произвольной длины, а не bytea длины 5, ещё раз.
понял, значит мне нужно создавать таблицу create table test ( data bytea ); А как впихнуть туда эти smallint ?
Вы пробовали то, что я написал выше? Это чем-то не подходит?
Или так: dmitigr=> create table foo(id serial not null, dat bytea not null); CREATE TABLE dmitigr=> insert into foo(dat) select (1::int2::text || 2::int2::text || 3::int2::text)::bytea; INSERT 0 1 Time: 4,144 ms dmitigr=> select * from foo; id | dat ----+---------- 1 | \x313233 (1 row)
А в чем экономия по сравнению с одним integer, в удобстве доступа из приложения?
мне нужно впихнуть 3 smallint ( 2 байт ) 2 int8_t ( 1 байт ) 1 int ( 4 байт ) В массив байт, размером 12
A так понятнее👍, просто 3 smalint изначальных не давали экономии в bytea
Почему не давали? 3 * sizeof(int2) = 6 байт. А 3 байта в bytea= 4 байта.
3 int2 = 1 integer
нет. integer 4 байта
При условиях автора задачи
Обсуждают сегодня