2013-03-03 10 views
6

Czy możliwe jest zastąpienie wszystkich wystąpień danego znaku (wyrażonych w Unicode) inną postacią (wyrażoną w Unicode) w polu varchar w PostgreSQL?Zastępowanie znaków Unicode w PostgreSQL

Próbowałem coś takiego:

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

Ale wydaje się, że tak naprawdę pisze ciąg „\ u0060” w tej dziedzinie, a nie znak odpowiadający tym kodem.

Odpowiedz

11

Według PostgreSQL documentation on lexical structure, należy użyć U& składnię:

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

Można również użyć PostgreSQL specyficzne formy ucieczki string E'\u0050'. Będzie to działać w starszych wersjach niż w przypadku formularza ewakuacyjnego Unicode, ale w przypadku nowszych wersji preferowany jest formularz ewakuacji unicode. To powinno pokazać, co się dzieje:

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

dziękuję! Zadziałało ;) – user1923631

3

To powinno działać z „znaków odpowiadających tym kodem” chyba przyjdzie klient lub druga warstwa w łańcuchu pokarmowym Zmieniany kodu!

Użyj również translate() or replace() do wykonania tego prostego zadania. Znacznie szybszy niż regexp_replace(). translate() jest również dobre dla wielu prostych zamienników naraz.
I uniknij puste aktualizacje z klauzula WHERE. Jeszcze szybciej i unika stołowych łódek i dodatkowych kosztów w postaci VACUUM.

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

Jeśli biec do problemów, należy użyć kodowania @mvp stanowił:

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