대답을 하려고 하다가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
정렬은 여러 번 수행됩니다. 각 역할에는 세 가지(때로는 그 이상)의 가중치가 할당됩니다. 이 예의 가중치는 다음과 같다고 가정합니다.
wt#1 wt#2 wt#3
space = [0000.0020.0002]
A = [1BC2.0020.0008]
정렬 키를 생성하려면 문자열 문자의 0이 아닌 가중치가 한 번에 한 가중치 수준씩 연결됩니다. 즉, 가중치가 0이면 해당 가중치는 추가되지 않습니다( 의 시작 부분에 표시됨 " 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 "
이것은 실제로 일어나는 일을 단순화한 것입니다.유니코드 정렬 알고리즘자세한 내용은. 위의 예시 가중치는 실제로 표준 표에서 가져온 것이며 일부 세부 정보는 생략되었습니다.