Możesz przekonwertować ciąg szesnastkowy na bajty za pomocą decode
funkcja (gdzie "kodowanie" oznacza kodowanie wartości binarnej do jakiejś wartości tekstowej). Na przykład:
select decode('DEADBEEF', 'hex');
decode
------------------
\336\255\276\357
co jest bardziej zrozumiałe przy domyślnym wyjściu 9.0:
decode
------------
\xdeadbeef
Powód, dla którego nie możesz po prostu powiedzieć E'\xDE\xAD\xBE\xEF'
jest to, że ma to na celu utworzenie wartości tekstowej, a nie bajta, więc Postgresql spróbuje przekonwertować go z kodowania klienta na kodowanie bazy danych. Możesz napisać bajtowy format ucieczki w ten sposób, ale musisz podwoić ukośniki odwrotne:E'\\336\\255\\276\\357'::bytea
. Myślę, że możesz zobaczyć, dlaczego format bajtów jest zmieniany .... IMHO decode()
funkcja jest rozsądnym sposobem pisania danych wejściowych, nawet jeśli wiąże się to z pewnym obciążeniem.