en_US.UTF-8 ロケールで予期しないソート順序が発生しました。

en_US.UTF-8 ロケールで予期しないソート順序が発生しました。

答えをしようとしています。SQLソートに関する質問です。sort、予期しないコマンドが見つかりました。

$ export LC_ALL=en_US.UTF-8  
$ echo "T-700A Grouped" > sort.txt
$ echo "T-700 AGrouped" >> sort.txt
$ echo "T-700A Halved" >> sort.txt
$ echo "T-700 Whole" >> sort.txt
$ cat sort.txt | sort
T-700 AGrouped
T-700A Grouped
T-700A Halved
T-700 Whole
$ 

なぜ700 A一番上700A700Aはなく一番上に並んでいるのです700 Wか?A次の文字に関係なく、前にスペースが必要です。

Cロケールを使用すると正常に動作します。

$ export LC_ALL=C
$ echo "T-700A Grouped" > sort.txt
$ echo "T-700 AGrouped" >> sort.txt
$ echo "T-700A Halved" >> sort.txt
$ echo "T-700 Whole" >> sort.txt
$ cat sort.txt | sort
T-700 AGrouped
T-700 Whole
T-700A Grouped
T-700A Halved
$ 

答え1

ソートは複数回行われます。各役割には3つ(時にはそれ以上)の重みが割り当てられます。この例の重みは次のとおりです。

         wt#1 wt#2 wt#3
space = [0000.0020.0002]
A     = [1BC2.0020.0008]

ソートキーを生成するには、文字列文字のゼロ以外の重みを一度に1つの重みレベルで連結します。つまり、重みがゼロの場合、その重みは追加されません(の先頭に表示されます" A")。だから

       wt#1   -- wt#2 ---   -- wt#3 ---
" A" = 1BC2   0020   0020   0002   0008
       A      sp     A      sp     A

       wt#1   wt#2   wt#3
"A"  = 1BC2   0020   0008
       A      A      A

       wt#1   -- wt#2 ---   -- wt#3 ---
"A " = 1BC2   0020   0020   0008   0002
       A      A      sp     A      sp

これらの配列を並べ替えると、次の順序が表示されます。

       1BC2   0020   0008               => "A"
       1BC2   0020   0020   0002   0008 => " A"
       1BC2   0020   0020   0008   0002 => "A "

これは実際に起こることを単純化したものです。Unicode ソートアルゴリズム詳細については。上記の例の重みは、実際には標準表から得られ、一部の詳細は省略されています。

関連情報