

WindowsOSへインストールしたPostgresSQLサーバーver.10で、CentOSのようにICU
Collationを使用する方法を教えてください。

[当方こちらの記事](https://blog.ohgaki.net/postgresql-10-icu-locale-collation-enables-
natural-japanese-sorting)をトレースしたいと考えています。


CC BY-SA 4.0
2018-09-03T01:34:34.790
48036
2020-07-07T12:04:55.457
29945
question
windows postgresql
WindowsOSへインストールしたPostgresSQLサーバーで、CentOSのようにICU Collationを使用する方法


Windows版の場合でも、`ICU`はインストールされているようで、以下のコマンドには成功しました。

[code]

    CREATE TABLE t (t text COLLATE "ja-x-icu");
    CREATE COLLATION digitslast (provider = icu, locale = 'ja-u-kr-latn-digit');
    
[/code]

しかし、以下を実行しても英字が数字の前にきません。

[code]

    select * from t order by t collate "digitslast";
    
[/code]

ドキュメントの [23.2.
照合順序サポート](https://www.postgresql.jp/document/10/html/collation.html)のページには以下の記述があり、エラーにはなっていませんが、照合順序の指定が機能していないと思われます。

>
> 設計上、ICUはロケール名としてどのような文字列も受け入れ、ドキュメントで説明されているフォールバック手続きを使って、ICUが提供するもっとも近いロケールにマッチさせます。  
>
> したがって、インストールされたICUが実際にはサポートしていない機能を使って照合順序の指定が構成されていたとしても、直接にはフィードバックはありません。  
>  そういうわけで、照合順序の定義が要件を満たしているかどうかを確認するためのアプリケーションレベルのテストケースを作成することをお勧めします。

この問題は、PostgreSQLをコンパイルする時の`ICU`のリンクの問題と思われるため、修正しようと思ったら`VC++`の知識が必要です。VC++を覚える気がないならば素直にLinux版を使った方がいいです。自分もWindows版でのこのような問題やVC++でコンパイルする難しさに泣かされてきたので、基本Linux版を使うようにしています。

WindowsOSであっても、`WSL`、`Vagrant`、`Docker`等を使えばLinuxを無料で使えるし、PostgreSQLの使用はネットワークでの接続なので、WindowsOS上のアプリからの使用も問題はありません。


CC BY-SA 4.0
2018-09-03T14:41:18.483
48058
2018-09-03T22:44:11.937
2018-09-03T22:44:11.937
15171
15171
48036
answer


配布ファイルに`icu*53.dll`が含まれていることからもわかると思いますが、ICU 53を使用してビルドされています。念のため

[code]

    C:\> pg_config --configure
    --enable-thread-safety --enable-nls --with-ldap --with-openssl --with-ossp-uuid --with-libxml --with-libxslt --with-icu --with-tcl --with-perl --with-python
    
[/code]

でも`\--with-icu`が含まれています。ちなみに[ICU support on
Windows](https://www.postgresql.org/message-
id/CAE9k0P%3DQRjtS1a0rgTyKag_%2Bs6XCs7vovV%2BgSkUfYVASog0P8w%40mail.gmail.com)でパッチ提供され[Add
MSVC build system support for
ICU](https://github.com/postgres/postgres/commit/03c396080ddc77b188a11dd54aa2a075ab2718e0)で取り込まれ`REL_10_BETA2`以降のソースコードであれば組み込むことができるようです。

ソースコードを追いかけましたが、次の２点しか見つけられませんでした。

  * [ICU 54以降とそれ以前とで`collcollate`の値を変えている](https://github.com/postgres/postgres/blob/322548a8abe225f2cfd6a48e07b99e2711d28ef7/src/backend/commands/collationcmds.c#L701)
  * [ICU 53以降でのみ`ucol_strcollUTF8`を使用する](https://github.com/postgres/postgres/blob/322548a8abe225f2cfd6a48e07b99e2711d28ef7/src/include/utils/pg_locale.h#L25-L34)

* * *

> 当方こちらの記事をトレースしたい

実際、何ができないのでしょうか？


CC BY-SA 4.0
2018-09-04T05:18:11.900
48070
2018-09-04T05:18:11.900
4236
48036
answer