MyTetra Share
Делитесь знаниями!
Как получить HEX-представление для поля, хранящего массив байт (тип BYTEA) в PostgreSQL
Время создания: 10.03.2020 10:42
Текстовые метки: postgresql, hex, bytea, массив байт, бинарное поле, база данных, PHP
Раздел: Компьютер - Программирование - SQL - PostgreSQL

Работать в PostgreSQL с бинарными полями, хранящими "сырые" массивы данных, не очень удобно. Функции pg_escape_bytea() и pg_unescape_bytea() могут помочь при выводе данных на консоль или в поток, но не сильно помогают, когда надо на основе данных, полученных из поля с типом BYTEA, сформировать новый SQL-запрос.


Удобным выходом была бы работа со строкой, в которой ноходится HEX-представление данных, содержащихся в BYTEA-поле. Как получить такую строку? Вот пример запроса:



SELECT uuid, encode(byte_array::bytea, 'hex') AS byte_array FROM messages WHERE id=1;



Здесь messages - это таблица, в которой есть поля id, uuid, byte_array. Поле byte_array имеет тип BYTEA.


Для получения HEX-представления содержимого поля, используется SQL-функция encode(). Ее проблема в том, что в возвращаемых данных имя этой функии заменит имя поля. То есть, в массиве с SQL-ответом, если делать запрос, например, через PHP, будут содержаться поля uuid и encode. Чтобы вернуть полю изначальное название, используется конструкция "AS byte_array".


В результате будет получена строка в HEX-представлении. Выглядеть она будет примерно так:



[byte_array] => 23aa96e15c8894aecb1e0feaa08ef7bb625852002287b9700160043006f007200650048



Чтобы этой строкой заполнить поле с типом BYTEA в новом запросе, ее надо написать в одинарных кавычках с префиксом \x, вот так:



'\x23aa96e15c8894aecb1e0feaa08ef7bb625852002287b9700160043006f007200650048'



Такую строку можно помещать в простой текстовый SQL-запрос, она будет корректно распарсена, и в базу данных будут добавлены именно указанные байты. Длинна запоминаемых байтов отпределяется длинной строки, никаких null-terminate символов не требуется.


 
MyTetra Share v.0.53
Яндекс индекс цитирования