PostgreSQL の varchar フィールドで、特定の文字 (Unicode で表現) をすべて別の文字 (Unicode で表現) に置き換えることは可能ですか?
私はこのようなことを試しました:
UPDATE mytable
SET myfield = regexp_replace(myfield, '\u0050', '\u0060', 'g')
しかし、実際には、そのコードに対応する文字ではなく、文字列 '\u0060' がフィールドに書き込まれているようです。
PostgreSQL の varchar フィールドで、特定の文字 (Unicode で表現) をすべて別の文字 (Unicode で表現) に置き換えることは可能ですか?
私はこのようなことを試しました:
UPDATE mytable
SET myfield = regexp_replace(myfield, '\u0050', '\u0060', 'g')
しかし、実際には、そのコードに対応する文字ではなく、文字列 '\u0060' がフィールドに書き込まれているようです。
字句構造に関する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)
クライアントまたは食物連鎖の他のレイヤーがコードを台無しにしない限り、「そのコードに対応する文字」で動作するはずです!
また、この単純なジョブにはtranslate()
orを使用します。replace()
よりもはるかに高速ですregexp_replace()
。translate()
一度に複数の単純な交換にも適しています。また、句を使用して空の更新
を
回避します。はるかに高速で、テーブル ボートや追加コストを回避できます。WHERE
VACUUM
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');