2016-02-18 2 views
0

Предположим, у нас есть строка 'a \ b'. Мне нужно сначала закодировать его, сохранить в файл, а затем прочитать его из файла и вернуть в db.Кодирование и декодирование в postgresql

Как кодировать и декодировать текст с символами эвакуации?

select encode(E'a\b'::bytea, 'base64') 
"YQg=" 
select decode('YQg=', 'base64') 
"a\010" 

После декодирования я не получаю обратно строку, как это было в его первоначальном виде.

ответ

3

Вы используете строку 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) 
+0

выберите convert_from (расшифровывают («YQG =», «base64»), 'utf-8') не возвращает 'a \ b', а вместо этого 'a <и некоторый странный символ>'. –

+0

Выполняется по версии 9.1.14 –

+0

@EdijsPetersons. Тогда ваша кодировка базы данных не UTF-8. Проверьте 'SELECT server_encoding;', чтобы увидеть. –

Смежные вопросы