ここから本文です

PostgreSQLのOrder byの仕様について(@が無視される?) 以下の様なデータを昇...

ae101_4ag_levinさん

2017/9/1923:45:15

PostgreSQLのOrder byの仕様について(@が無視される?)

以下の様なデータを昇順でorder byした場合、想定のソート順と違う順序で抽出されます。
@はソートでは無視されるのがPostgreSQLの

仕様でしょうか?
ドキュメントを探しているのですが、@が無視される?ようなドキュメントが見つけられず、仕様なのか何か設定の問題なのか、断定ができません。
どなたか、お教えください。

[データ]
HBSA
H@CS
HESA
H@FS

[希望のソート結果]
H@CS
H@FS
HBSA
HESA

[実際のソート結果]
HBSA
H@CS
HESA
H@FS

【環境】
PostgreSQL9.6(AWS上のRDS)
文字コード UTF-8

よろしくお願いいたします。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
41
回答数:
3
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tumura999さん

リクエストマッチ

2017/9/2217:39:11

COLLATEで@を抜くような動作はちょっと想像できませんが、alter tableしなくてもpostgresはorder byでcollate指定できます。

ORDER BY データ COLLATE "ja_JP.UTF8"

もっとも、実際の原因はSQL側にあると思います。
実際に投げたSQLを書いていただけませんでしょうか。

たとえば実際にはorder by書いたview切って、それを単純selectしているなど、標準SQLの仕様上、orderされないSQLを書いている可能性がありますので。

質問した人からのコメント

2017/9/26 08:48:10

皆さん、ご回答・アドバイスありがとうございます。
まず、無事に問題が解決できたことを報告させていただきます。

原因についてですが、皆さんご推察の通り、照合順序の問題でした。
psqlで\lで確認したところ、us_en.UTF-8になっておりました。
当面の対策では、order by にCOLLATE を指定することで対応できました。

全てベストアンサーに選びたいですが、直接の解決策になった回答

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

2017/9/2102:13:31

COLLATE の設定ですかねぇ。

CREATE TABLE t_test2
(
id bigserial primary key
, f_vchar1 varchar(255) COLLATE "C"
);

INSERT INTO t_test2 (f_vchar1) VALUES ('HBSA');
INSERT INTO t_test2 (f_vchar1) VALUES ('H@CS');
INSERT INTO t_test2 (f_vchar1) VALUES ('HESA');
INSERT INTO t_test2 (f_vchar1) VALUES ('H@FS');

SELECT * FROM t_test2 ORDER BY f_vchar1;

で出力は期待通りになりますか?

oo_daisukeさん

2017/9/2016:21:06

psqlで接続したときに
\l
の結果はどう出ていますか?

名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権
-----------+----------+------------------+----------+-------------------+-----------------------
hogeta | postgres | UTF8 | C | C |
この状態で確認しましたが

create table sort_sample
( item_id varchar(20) primary key
, item_name varchar(60)
)
;
INSERT INTO sort_sample ( item_id , item_name )
VALUES ('HBSA','3')
, ('H@CS','1')
, ('HESA','4')
, ('H@FS','2')
;
SELECT item_id
, item_name
FROM sort_sample
ORDER BY item_id;
以上で、ae101_4ag_levinが期待されている通りの結果を確認できたのですが。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。