172 похожих чатов

Привет всем, подскажите, пожалуйста, как правильно сделать вставку в

поле 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
Понимаю, что надо использовать &, но только как правильно ?

23 ответов

20 просмотров
Егор-miruzzy Автор вопроса

Yaroslav не подскажешь тут?

INSERT INTO testtable(col) VALUES (decode('aaabbbfff', 'hex'))

Егор-miruzzy Автор вопроса
Dmitriy Sviridov
INSERT INTO testtable(col) VALUES (decode('aaabbb...

так а как слить 2 переменные smallint в одну последовательность байт ?

Это не поле bytea, это массив из пяти bytea. Что Вам на самом деле нужно?

Yaroslav Schekin
Это не поле bytea, это массив из пяти bytea. Что В...

Уточнение: текущая реализация не ограничивает размер массивов. Поэтому 5 в bytea[5] - это так, для документации.

Егор-miruzzy Автор вопроса
Yaroslav Schekin
Это не поле bytea, это массив из пяти bytea. Что В...

Суть вот в чём была таблица логирования create table .... ( a smallint, b smallint, c smallint); Но все эти переменные имеют значения 0..100 ) Что в принципе может помещаться в 1 байт Вот и мы хотим 3 2-байтовых числа запихнуть в колонку с 3-мя байтами

Егор-miruzzy Автор вопроса
Dima Igrishin
Уточнение: текущая реализация не ограничивает разм...

не обязательно bytea[5] мне нужна реализация, описанная сообщением выше

Егор-miruzzy Автор вопроса
Dima Igrishin
Вы с клиента хотите это сделать?

нет, именно в БД, в функциях на pl/psql

Егор miruzzy
Суть вот в чём была таблица логирования create ta...

Ну так, например (если я правильно понял): SELECT set_byte('x', 0, 1) || set_byte('x', 0, 2) || set_byte('x', 0, 3); > не обязательно bytea[5] Это массив из пяти bytea (условно, как выше написали), каждое произвольной длины, а не bytea длины 5, ещё раз.

Егор-miruzzy Автор вопроса
Yaroslav Schekin
Ну так, например (если я правильно понял): SELECT ...

понял, значит мне нужно создавать таблицу create table test ( data bytea ); А как впихнуть туда эти smallint ?

Егор miruzzy
понял, значит мне нужно создавать таблицу create...

Вы пробовали то, что я написал выше? Это чем-то не подходит?

Егор miruzzy
понял, значит мне нужно создавать таблицу create...

Или так: 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)

Егор miruzzy
понял, значит мне нужно создавать таблицу create...

А в чем экономия по сравнению с одним integer, в удобстве доступа из приложения?

Егор-miruzzy Автор вопроса
Konstantin Zaitsev
А в чем экономия по сравнению с одним integer, в у...

мне нужно впихнуть 3 smallint ( 2 байт ) 2 int8_t ( 1 байт ) 1 int ( 4 байт ) В массив байт, размером 12

Егор miruzzy
мне нужно впихнуть 3 smallint ( 2 байт ) 2 int8_t...

A так понятнее👍, просто 3 smalint изначальных не давали экономии в bytea

Konstantin Zaitsev
A так понятнее👍, просто 3 smalint изначальных не д...

Почему не давали? 3 * sizeof(int2) = 6 байт. А 3 байта в bytea= 4 байта.

Konstantin Zaitsev
3 int2 = 1 integer

нет. integer 4 байта

Konstantin Zaitsev
3 int2 = 1 integer

При условиях автора задачи

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта