2013-03-03 19 views
6

E 'possibile sostituire tutte le occorrenze di un dato carattere (espresso in unicode) con un altro carattere (espresso in unicode) in un campo varchar in PostgreSQL?Sostituisci caratteri unicode in PostgreSQL

Ho provato qualcosa di simile:

UPDATE mytable 
SET myfield = regexp_replace(myfield, '\u0050', '\u0060', 'g') 

ma sembra che scrive davvero la stringa '\ u0060' nel campo e non il carattere corrispondente a tale codice.

risposta

11

Secondo il PostgreSQL documentation on lexical structure, si dovrebbe usare U& sintassi:

UPDATE mytable 
SET myfield = regexp_replace(myfield, U&'\0050', U&'\0060', 'g') 

È inoltre possibile utilizzare il modulo di fuga-stringa specifica-PostgreSQL E'\u0050'. Funzionerà su versioni precedenti rispetto al modulo di escape Unicode, ma il modulo di escape Unicode è preferito per le versioni più recenti. Questo dovrebbe mostrare cosa sta succedendo:

regress=> SELECT '\u0050', E'\u0050', U&'\0050'; 
?column? | ?column? | ?column? 
----------+----------+---------- 
\u0050 | P  | P 
(1 row) 
+0

Grazie! Ha funzionato ;) – user1923631

3

dovrebbe funzionare con i "caratteri corrispondente a quel codice" a meno che provengono cliente o di altro livello nella catena alimentare Mangles il codice!

Inoltre, utilizzare translate() or replace() per questo lavoro semplice. Molto più veloce di regexp_replace(). translate() è anche utile per più sostituzioni semplici alla volta.
E evitare aggiornamenti vuoti con una clausola WHERE. Molto più veloce ancora, ed evita il costo del table boat e del costo aggiuntivo VACUUM.

UPDATE mytable 
SET myfield = translate(myfield, 'P', '`') -- actual characters 
WHERE myfield <> translate(myfield, 'P', '`'); 

Se si continua a correre in problemi, utilizzare la codifica @mvp fornito:

UPDATE mytable 
SET myfield = translate(myfield, U&'\0050', U&'\0060') 
WHERE myfield <> translate(myfield, U&'\0050', U&'\0060');