備忘録的プログラミングリファレンス

日本語のソート

 日本語のソートが上手くいかない場合があります。それはソートに関する文字列の設定、ローケル(言語設定)が英語になっている可能性があります。

 ここでは、ソートの文字列の設定 LC_COLLATE と利用できる文字列設定を確認する方法。文字列の設定のして方法について説明します。

文字列の並び替え順の設定 LC_COLLATE

 現在の文字列の並び替えの順の設定を確認します。

=> SHOW LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)

 'en_US.UTF-8'の場合は、英語は正しく語順でソートされますが、日本語はソートされません。

 ソートに使用する文字列の設定は、問い合わせで「ORDER BY title COLLATE "ja_JP.utf8"」と指定する方法と、カラムのソート時の文字列の設定を変更する方法があります。

 ソートの文字列の設定は、システムに設定したい文字列がなければなりません。ソートに利用できるシステムの文字列の設定は以下のように確認します。

システムの文字列の設定

 ソートに利用できるシステムの文字列の設定を確認するには、 pg_collation をみます。

=> SELECT * from pg_collation;
collname        | collnamespace | collowner | collprovider | collencoding |   collcollate    |    collctype     | collversion
------------------------+---------------+-----------+--------------+--------------+------------------+------------------+-------------
default                |            11 |        10 | d            |           -1 |                  |                  |
C                      |            11 |        10 | c            |           -1 | C                | C                |
POSIX                  |            11 |        10 | c            |           -1 | POSIX            | POSIX            |
ucs_basic              |            11 |        10 | c            |            6 | C                | C                |
C.UTF-8                |            11 |        10 | c            |            6 | C.UTF-8          | C.UTF-8          |
en_AG                  |            11 |        10 | c            |            6 | en_AG            | en_AG            |
...

 ここに ja_JP.utf8 がない場合は、C または C.UTF-8 を利用します。

クエリーでソートの文字列の設定を指定 COLLATE

 クエリーで COLLATE コマンドを加えてソートの文字列の設定を指定します。

...
ORDER BY title COLLATE "ja_JP.utf8"

 ja_JP.utf8 がない場合は、C で指定します。

...
ORDER BY title COLLATE "C"

 カラムごと、もしくは PostgreSQL アプリケーションに上記のソートの文字列の設定を行えば問い合わせごとに指定する必要がありません。

カラムにソートの文字列の設定を指定

 カラムに指定すれば、問い合わせでごとにソートの文字列を指定する必要がありません。

=> ALTER TABLE [テーブル名] ALTER COLUMN [カラム名] TYPE VARCHAR COLLATE "ja_JP.utf8";
	

 または、

=> ALTER TABLE [テーブル名] ALTER COLUMN [カラム名] TYPE VARCHAR COLLATE "C";
	

PostgreSQL アプリケーションの設定を変更する

 PostgreSQL アプリケーションのローケル(言語設定)設定を変更についてです。

 システムのローケルと PostgreSQL アプリケーションのローケルの設定があります。
 ほとんど場合は、PostgreSQL のインストール時にシステムのローケルに PostgreSQL のローケルが合わせられます。

 インストール後の PostgreSQL を運用している状態でローケルを変更するには、運用しているデータベース全体が影響するために慎重に PostgreSQL を初期化する必要があります。

 不具合が起こりうることもありますのでここでは取り上げません。詳しく知りたい方は調べてみてください。