3

タイトルはそれをかなりうまくまとめています。Postgres ~ 演算子の Unicode 大文字に一致する正規表現を探しています。明らかな方法は機能しません:

=> select 'A' ~ '[[:upper:]]';
 ?column? 
----------
 t
(1 row)

=> select 'Ó' ~ '[[:upper:]]';
 ?column? 
----------
 t
(1 row)

=> select 'Ą' ~ '[[:upper:]]';
 ?column? 
----------
 f
(1 row)

Postgresql 9.1 を使用しており、ロケールは pl_PL.UTF-8 に設定されています。注文はうまくいきます。

=> show LC_CTYPE;
  lc_ctype   
-------------
 pl_PL.UTF-8
(1 row)
4

2 に答える 2

4

PG 9.1以前のバージョンの正規表現エンジンは、コードポイントが1バイトに収まらない文字を正しく分類しません。211であるというコードポイント'Ó'はそれを正しく理解しますが、のコードポイント'Ą'は260であり、255を超えています。

PG 9.2はこれで優れていますが、すべてのアルファベットに対して100%正しいわけではありません。PostgreSQLソースコードのこのコミット、特にコメントのこれらの部分を参照してください。

255を超える文字コードのwctype.hの結果を考慮しないように、ハードワイヤードの制限を削除します

それでも、U + 7FF(2バイトのUTF8文字の制限として選択)までプッシュできます。これにより、少なくとも東ヨーロッパ人はより良い解決策が得られるまで幸せになります。

残念ながら、これは9.1にバックポートされませんでした

于 2013-01-12T13:48:33.740 に答える
1

perl の正規表現が Unicode を完全に処理することがわかりました。

create extension plperl;

create function is_letter_upper(text) returns boolean
immutable strict language plperl
as $$
    use feature 'unicode_strings';
    return $_[0] =~ /^\p{IsUpper}$/ ? "true" : "false";
$$;

perl 5.16.2 を使用した postgres 9.2 でテスト済み。

于 2013-06-09T18:27:44.213 に答える