2

私はPostgresqlに精通していません。Rails アプリを Heroku に移行するため、学習しようとしています。

順序付け問題の例を次に示します。

# select name_kr from users order by name_kr;

 name_kr 
---------
 곽철
 김영
 박영
 안준
 양민
 이남
 임유
 정신
 차욱
 강동수
 강상구
 강신용
 강용석
 강지영
 강지원
 강호석

韓国語が分からないかもしれません。しかし、奇妙な点の 1 つは、最初に 2 つの音節の単語と 3 つの音節を表示することです。

関連情報は次のとおりです。

kwanak_development=# show lc_collate;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

kwanak_development=# show lc_ctype;
  lc_ctype   
-------------
 en_US.UTF-8
(1 row)

私は何を間違えましたか?

ありがとう。

サム

追加情報:

order by の照合を試みたところ、興味深い結果が得られました。

select name_kr from users order by name_kr collate "ko_KR"; => Same as above
select name_kr from users order by name_kr collate "C"; => Correct Result
4

2 に答える 2

2

sortPostgreSQL 照合は、主に PostgreSQL によって処理され、UNIXコマンドと同じ規則に従う必要があります。最初に行うことは、sortコマンドを使用して、これが実際に問題なのか、それともスタックのさらに下にある何かの単なる症状なのかを判断することです。

sort同じロケール設定でこの問題が発生しない場合は、PostgreSQL チームにバグを報告してください (これは非常にありそうもないことですが、可能性はあります)。問題がある場合は、使用している標準 C ライブラリのメーカーに相談する必要があります。

韓国語の順序付けに慣れていない私たちへの最後の注意として、単に問題の順序付けではなく、目的の順序付けを記述してみてください。

于 2013-04-20T07:34:40.400 に答える
1

OS XでGNU sort5.93を使用すると、デフォルトのロケールで同じ順序になります(おそらくen_GB.utf8またはen_US.utf8のいずれかです-とにかく韓国語を知らないものです)。ただし、LC_ALLko_KR.utf8 に設定すると、3 文字の文字列が最初にソートされます。2 文字と 3 文字の文字列のセットは、それらの間で同じ順序を維持します。

3 文字の名前はすべて「강」で始まることに注意してください。これがどのように見えるかというと、単純なロケールでは「강」は他のすべての最初の文字の後にソートされますが、韓国語ではその前にソートされます。最初の文字が 2 文字の文字列のいずれかの最初の文字 (つまり、"양호석") に置き換えられた 3 文字の文字列の 1 つで構成される意味のない文字列を挿入すると、2 文字の文字列で並べ替えられます。文字列。これは、並べ替え順序が文字列の長さとは関係なく、単に「강」の並べ替えに関係していることを示しています。

私のロケールで「강」が他の文字の後に並べ替えられる理由がまったくわかりません。「강」はコード ポイント U+AC15 にあります。「곽」はコード ポイント U+ACFD にあります。'차' はコード ポイント U+CC28 にあります。並べ替えが生のコード ポイントで行われた場合、韓国語の並べ替えの場合と同様に、'강' が他の文字の前に並べ替えられます。

これらの文字列を Java で並べ替えると、韓国語の並べ替えのように「강」文字列が最初に表示されます。Java は Unicode の問題にかなり注意を払っています。それと韓国のソートが一致しているという事実は、それが正しい順序であると私に思わせます.

文字を UTF-8 でエンコードすると、最初のバイトは 0xea になり、0xea から 0xec までの値で始まるバイトにエンコードされる他の文字の前にソートされます。これがおそらくcollate "C"、正しい結果が得られる理由です。その設定により、文字列はエンコードされた文字ではなく、不透明なバイトの文字列としてソートされます。

collate "ko_KR"なぜ間違った結果が得られるのか、私は完全に困惑しています。

于 2013-06-09T20:55:10.510 に答える