2012-04-11 6 views
1

Ich Datendump von einer externen Quelle geladen und einige Zeichenketten enthalten \uXXXX Sequenzen für die UTF-8 Zeichen, wie diese:Wie konvertiert man literale Sequenzen in UTF-8?

\u017D\u010F\u00E1r nad S\u00E1zavou 

ich den Inhalt unter Verwendung von E überprüfen ‚‘ konstant in psql, kann aber keine finden Funktion/Operator, um mir den richtigen Wert zurückzugeben.

Ich möchte fragen, ob es möglich ist, diese Zeichenfolge mit Unicode Escapes in normalen UTF8 ohne mit PL/pgSQL Funktionen zu konvertieren?

+0

Das literarische Format \ E '' ist keine psql-Client-Sache - jeder SQL-Code, der auf dem PostgreSQL-Server ausgeführt wird, kann diese Syntax verwenden. Sie können die Zeichenfolge in ein Literal wie 'E' \ u017D \ u010F \ u00E1r nad S \ u00E1zavou' setzen, um es richtig interpretieren zu lassen; Was möchtest du noch tun? – kgrittn

+0

Ich möchte in der Lage sein, etwas zu tun: 'UPDATE Tabelle SET richtig = somefunc ('\ u017D \ u010F \ u00E1r nad S \ u00E1zavou') WHERE ID = 1;'. Und die erwartete UTF8-Zeichenfolge erhalten. – vyegorov

+0

Wenn die Datenbank UTF8-Codierung verwendet, sollten Sie in der Lage sein, etwas zu tun: 'UPDATE Tabelle SET richtig = E '\ u017D \ u010F \ u00E1r nad S \ u00E1zavou' WHERE ID = 1;' Was erhalten Sie, wenn Sie ausführen 'SHOW server_encoding;'? Wie wäre es mit 'SHOW client_encoding;'? – kgrittn

Antwort

2

Ich glaube nicht, dass es eine eingebaute Methode dafür gibt. Der einfachste Weg, ich denken kann, ist die plpgsql Funktion, die Sie vermeiden wollte:

CREATE OR REPLACE FUNCTION str_eval(text, OUT t text) AS 
$func$ 
BEGIN 
EXECUTE 'SELECT E''' || replace($1, '''', '''''') || '''' 
USING $1 
INTO t; 
END 
$func$ LANGUAGE plpgsql IMMUTABLE STRICT; 

Die aktualisierte Version Garantien gegen SQLi und ist auch schneller.

+0

Erwin Brandsetter, Danke! – ceadreak

Verwandte Themen