答えをしようとしています。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
一番上700A
で700A
はなく一番上に並んでいるのです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 ソートアルゴリズム詳細については。上記の例の重みは、実際には標準表から得られ、一部の詳細は省略されています。