将转义的Unicode字符转换回PostgreSQL中的实际字符

时间:2013-11-21 15:01:20

标签: postgresql unicode encoding postgresql-9.1

有没有办法将以下字符串转换回人类可读的值?我有一些外部数据,其中所有非ascii字符都被转义。

示例字符串:

16 StringProvider_111=Telefon\u00ED kontakty
17 StringProvider_116=Odpov\u011Bdn\u00E1 osoba

必填结果:

16 StringProvider_111=Telefoní kontakty
17 StringProvider_116=Odpovědná osoba

SQLFiddle

数据库具有UTF8编码和排序规则cs_CZ.UTF-8

1 个答案:

答案 0 :(得分:6)

一个老技巧就是为此目的使用解析器:

postgres=# select e'Telefon\u00ED kontakty';
     ?column?      
-------------------
 Telefoní kontakty
(1 row)

CREATE OR REPLACE FUNCTION public.unescape(text)
RETURNS text
LANGUAGE plpgsql
AS $function$
DECLARE result text;
BEGIN
  EXECUTE format('SELECT e''%s''', $1) INTO result;
  RETURN result;
END;
$function$

它有效,但是SQL注入很容易受到攻击 - 所以你应该首先清理输入文本!

这里的可读性较差,但是安全版本 - 但您必须手动指定一个char作为转义符号:

CREATE OR REPLACE FUNCTION public.unescape(text, text) 
 RETURNS text
 LANGUAGE plpgsql
 AS $function$
 DECLARE result text;
 BEGIN
   EXECUTE format('SELECT U&%s UESCAPE %s', 
                         quote_literal(replace($1, '\u','^')),
                         quote_literal($2)) INTO result;
   RETURN result;
 END;
 $function$

结果

postgres=# select unescape('Odpov\u011Bdn\u00E1 osoba','^');
    unescape     
-----------------
 Odpovědná osoba
(1 row)