Хранение двоичных данных в текстовом столбце не очень хорошая идея.Вы можете использовать тип bytea
, например:
drop table if exists my_table;
create table my_table(id serial primary key, switch bytea);
insert into my_table (switch) values
('\x7272'),
('\x1111'),
('\xffff');
Вы можете легко установить и получить значения в шестнадцатеричном формате, преобразовать их в битовые строки, получить / установить отдельные байты / биты, например:
select id,
switch,
right(switch::text, -1)::bit(16) as bits,
right(switch::text, -1)::bit(16)::int as int,
get_byte(switch, 0)
from my_table;
id | switch | bits | int | get_byte
----+--------+------------------+-------+----------
1 | \x7272 | 0111001001110010 | 29298 | 114
2 | \x1111 | 0001000100010001 | 4369 | 17
3 | \xffff | 1111111111111111 | 65535 | 255
(3 rows)
Вы можете привести text
(varchar
) к bytea
:
select 'r'::bytea;
bytea
-------
\x72
(1 row)
Обратите внимание, что в некоторых инструментах (например, PgAdmin III) вы должны установить параметр для получения шестнадцатеричного значениявывод:
set bytea_output to hex;
Согласно документации:
Формат вывода зависит от параметра конфигурации bytea_output;по умолчанию используется шестнадцатеричное.(Обратите внимание, что шестнадцатеричный формат был введен в PostgreSQL 9.0; более ранние версии и некоторые инструменты его не понимают.)
Читайте также в документации: