sql >> データベース >  >> RDS >> PostgreSQL

エスケープされたUnicode文字をPostgreSQLで実際の文字に変換します

    古いトリックの1つは、この目的でパーサーを使用することです。

    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インジェクションの脆弱性があるため、最初に入力テキストをサニタイズする必要があります!

    これは読みにくいですが、安全なバージョンですが、エスケープ文字として1文字を手動で指定する必要があります:

    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)
    



    1. バイナリ文字列をCLOB列に格納できますか

    2. 行ごとのOracleクエリの順次合計

    3. SQL Server2005DateAddを使用して日付に日を追加する

    4. 連続する連続番号のグループの境界を見つける方法は?