テキストの並べ替え動作(char
を含む) およびvarchar
text
タイプ)は現在の照合によって異なります あなたのロケールの。
以前の密接に関連する質問を参照してください:
- PostgreSQLソート
- https://stackoverflow.com/q/21006868/398670
ローカル言語のルールに従って適切にローカライズされたソートではなく、ASCII値による単純なソートを実行する場合は、COLLATE
を使用できます。 条項
select *
from test
order by title COLLATE "C" ASC
または、データベースの照合をグローバルに変更します(ダンプとリロード、または完全なインデックスの再作成が必要です)。私のFedora19Linuxシステムでは、次の結果が得られます:
regress=> SHOW lc_collate;
lc_collate
-------------
en_US.UTF-8
(1 row)
regress=> WITH v(title) AS (VALUES ('#a'), ('a'), ('#'), ('a#a'), ('a#'))
SELECT title FROM v ORDER BY title ASC;
title
-------
#
a
#a
a#
a#a
(5 rows)
regress=> WITH v(title) AS (VALUES ('#a'), ('a'), ('#'), ('a#a'), ('a#'))
SELECT title FROM v ORDER BY title COLLATE "C" ASC;
title
-------
#
#a
a
a#
a#a
(5 rows)
PostgreSQLはオペレーティングシステムの照合サポートを使用するため、結果がホストOSごとにわずかに異なる可能性があります。特に、Mac OS Xの少なくとも一部のバージョンでは、Unicodeの照合処理が大幅に壊れています。