7

PostgreSQL の varchar フィールドで、特定の文字 (Unicode で表現) をすべて別の文字 (Unicode で表現) に置き換えることは可能ですか?

私はこのようなことを試しました:

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

しかし、実際には、そのコードに対応する文字ではなく、文字列 '\u0060' がフィールドに書き込まれているようです。

4

2 に答える 2

13

字句構造に関するPostgreSQLのドキュメントによると、U&構文を使用する必要があります。

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

PostgreSQL固有のエスケープ文字列形式を使用することもできますE'\u0050'。これは、ユニコードエスケープフォームよりも古いバージョンで機能しますが、新しいバージョンではユニコードエスケープフォームが推奨されます。これは何が起こっているかを示すはずです:

regress=> SELECT '\u0050', E'\u0050', U&'\0050';
 ?column? | ?column? | ?column? 
----------+----------+----------
 \u0050   | P        | P
(1 row)
于 2013-03-03T19:58:26.487 に答える
5

クライアントまたは食物連鎖の他のレイヤーがコードを台無しにしない限り、「そのコードに対応する文字」で動作するはずです!

また、この単純なジョブにはtranslate()orを使用します。replace()よりもはるかに高速ですregexp_replace()translate()一度に複数の単純な交換にも適しています。また、句を使用して空の更新
を 回避します。はるかに高速で、テーブル ボートや追加コストを回避できます。WHEREVACUUM

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

問題が発生し続ける場合は、提供されているエンコーディング@mvpを使用してください。

UPDATE mytable
SET   myfield =  translate(myfield, U&'\0050', U&'\0060')
WHERE myfield <> translate(myfield, U&'\0050', U&'\0060');
于 2013-03-03T20:22:02.920 に答える