日本語のソート
日本語のソートが上手くいかない場合があります。それはソートに関するローケル(言語設定)と文字コードの設定が英語または別の言語やデータと文字コードが異なっている可能性があります。
ここでは、ソートに関する言語と文字コードの設定 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 を運用している状態でローケルを変更することは、データベース全体が影響するために慎重に設定を行う必要があります。
不具合が起こりうることもありますのでここでは取り上げません。詳しく知りたい方は調べてみてください。