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

정렬은 여러 번 수행됩니다. 각 역할에는 세 가지(때로는 그 이상)의 가중치가 할당됩니다. 이 예의 가중치는 다음과 같다고 가정합니다.

         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 "

이것은 실제로 일어나는 일을 단순화한 것입니다.유니코드 정렬 알고리즘자세한 내용은. 위의 예시 가중치는 실제로 표준 표에서 가져온 것이며 일부 세부 정보는 생략되었습니다.

관련 정보