Вы используете строку E''
(escape-строку) и литье - bytea
. Результатом будет представление этой строки в вашей текущей кодировке базы данных - возможно, UTF-8.
E'a\b'
является персонажем a
, то персонаж, представленный побегом \b
, который является порядковым номером \x08
. PostgreSQL представляет эту строку с hex-escape при печати на терминал, потому что это непечатаемый символ. Строка все еще имеет два символа.
postgres=> SELECT E'a\b';
?column?
----------
a\x08
(1 row)
postgres=> SELECT length(E'a\b');
length
--------
2
(1 row)
Актерские к bytea
неявно выполняет преобразование в текущей кодировку базы данных:
postgres=> SELECT E'a\b'::bytea;
bytea
--------
\x6108
(1 row)
(\x61
является ASCII порядковым для a
в большинстве кодировок).
Кроме того вы должны быть на старой PostgreSQL, так как у вас есть bytea_output = escape
, в результате чего восьмеричной выход побега вместо:
postgres=> SELECT E'a\b'::bytea;
bytea
-------
a\010
(1 row)
Вы должны декодировании BYTEA обратно в текстовую строку, например,
convert_from(decode('YQg=', 'base64'), 'utf-8')
... и даже тогда непечатаемый символ \ б будет напечатан как \x08
по psql
. Вы можете убедиться, что это действительно тот символ внутри базы данных с использованием другого клиента.
BTW, что происходит будет понятнее, если вы вместо того, чтобы явно кодируются, когда вы сохранили ее, а не полагаться на гипсе, чтобы BYTEA:
encode(convert_to(E'a\b', 'utf-8'), bytea)
выберите convert_from (расшифровывают («YQG =», «base64»), 'utf-8') не возвращает 'a \ b', а вместо этого 'a <и некоторый странный символ>'. –
Выполняется по версии 9.1.14 –
@EdijsPetersons. Тогда ваша кодировка базы данных не UTF-8. Проверьте 'SELECT server_encoding;', чтобы увидеть. –