2013-03-03 21 views
6

Có thể thay thế tất cả các lần xuất hiện của một ký tự cụ thể (được biểu thị bằng unicode) với một ký tự khác (được biểu thị bằng unicode) trong trường varchar trong PostgreSQL không?Thay thế các ký tự unicode trong PostgreSQL

tôi đã cố gắng một cái gì đó như thế này:

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

Nhưng có vẻ như nó thực sự viết chuỗi '\ u0060' trong lĩnh vực này và không phải là nhân vật tương ứng với mã đó.

Trả lời

11

Theo PostgreSQL documentation on lexical structure, bạn nên sử dụng U& cú pháp:

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

Bạn cũng có thể sử dụng các hình thức thoát dây PostgreSQL cụ thể E'\u0050'. Điều này sẽ hoạt động trên các phiên bản cũ hơn so với dạng thoát unicode, nhưng dạng thoát unicode được ưu tiên cho các phiên bản mới hơn. Điều này sẽ hiển thị những gì đang xảy ra:

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

Cảm ơn bạn! Nó đã làm việc ;) – user1923631

3

Nó phải hoạt động với "ký tự tương ứng với mã đó" trừ khi đến khách hàng hoặc lớp khác trong chuỗi thức ăn mangmã của bạn!

Ngoài ra, hãy sử dụng translate() or replace() cho công việc đơn giản này. Nhanh hơn nhiều so với regexp_replace(). translate() cũng tốt cho nhiều lần thay thế đơn giản tại một thời điểm.
Và tránh cập nhật trống với mệnh đề WHERE. Nhanh hơn nhiều, và tránh thuyền bảng và chi phí VACUUM bổ sung.

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

Nếu bạn tiếp tục chạy vào vấn đề, sử dụng mã hóa @mvp cung cấp:

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