поле 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 байта
При условиях автора задачи
Обсуждают сегодня