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

日本語のソート

 日本語のソートが上手くいかない場合があります。それはソートに関するローケル(言語設定)と文字コードの設定が英語または別の言語やデータと文字コードが異なっている可能性があります。

 ここでは、ソートに関する言語と文字コードの設定 LC_COLLATE の確認方法と利用できる設定をみる方法、その設定の方法について解説します。

- ad -

ソートの設定 LC_COLLATE

 SHOW LC_COLLATEで、現在の文字列のソートの設定を確認します。

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

 'en_US.UTF-8'の場合は、英語用で文字コードが UTF-8 という設定です。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 を運用している状態でローケルを変更することは、データベース全体が影響するために慎重に設定を行う必要があります。

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