Postgres SQL читает двоичное значение из строкового поля? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть столбец в базе данных Postgres, который имеет тип varchar, но в нем хранится двоичное значение.Как я могу вернуть двоичное значение столбца так, как я могу его прочитать?

Например, в тот момент, когда я вижу «r» в столбце, я хочу видеть 1 и 0, которые составляютзначение для r.


Чтобы быть немного более понятным о том, что я хочу.Я думаю, что приложение хранит данные о отмеченных флажках в двоичном виде.Так для группы флажков:

  • Не проверено (0)
  • Проверено (1)
  • Проверено (1)
  • Проверено (1)
  • Не проверено (0)
  • Не проверено (0)
  • Проверено (1)
  • Не проверено (0)

itхранит значение «r», и я хочу увидеть двоичный или шестнадцатеричный из значения, которое сохраняется.Поэтому для значения «r» я хочу получить шестнадцатеричное значение «72» или двоичное значение «0111 0010»

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Хранение двоичных данных в текстовом столбце не очень хорошая идея.Вы можете использовать тип 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; более ранние версии и некоторые инструменты его не понимают.)

Читайте также в документации:

0 голосов
/ 17 декабря 2018

Использование varchar для этого плохая идея.Например, вы не можете хранить ноль байтов таким образом.

В любом случае, ответ на ваш вопрос должен быть простым приведением типа:

CAST(textcol AS bytea)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...