이 질문은 데이터베이스와 관련이 없지만 유니 코드 처리 및 규칙에 관한 것입니다.
를 기반으로 https://docs.microsoft.com/en-us/sql/t-sql/statements/windows-collation-name-transact-sql Latin1_General_100_CS_AS 방법 : "데이터 정렬 코드 페이지에 대한 규칙과지도를 정렬 라틴어 일반 사전을 사용 CS = 대소 문자 구분 및 AS = 악센트 구분이 추가 된 1252 "
Windows 코드 페이지 1252와 유니 코드 ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) 간의 매핑 은 처리중인 모든 문자에 대해 동일한 값을 표시합니다 (매크로를 제외하고는 제외) Microsoft 매핑에는 존재하지 않으므로이 경우 어떻게되는지 알지 못하므로 지금은 유니 코드 도구 및 용어에 집중할 수 있습니다.
먼저 모든 문자열에 대해 우리가 다루고있는 것을 정확하게 알려주십시오.
0065 LATIN SMALL LETTER E
0041 LATIN CAPITAL LETTER A
00E9 LATIN SMALL LETTER E WITH ACUTE
0042 LATIN CAPITAL LETTER B
00EB LATIN SMALL LETTER E WITH DIAERESIS
0043 LATIN CAPITAL LETTER C
00E8 LATIN SMALL LETTER E WITH GRAVE
0044 LATIN CAPITAL LETTER D
00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
0045 LATIN CAPITAL LETTER E
0113 LATIN SMALL LETTER E WITH MACRON
0046 LATIN CAPITAL LETTER F
유니 코드 데이터 정렬 알고리즘은 https://www.unicode.org/reports/tr10/에 설명되어 있습니다.
일부 규칙은 상황에 따라 다르기 때문에 정렬이 한 문자에만 의존 할 수 없음을 설명하는 1.3 "문맥 민감도"섹션을 살펴보십시오.
1.8의 다음 사항도 참고하십시오.
데이터 정렬은 문자열의 속성이 아닙니다. 데이터 정렬 순서는 일반적으로 연결 또는 하위 문자열 작업에서 유지되지 않습니다.
기본적으로이 알고리즘은 완전히 사용자 정의 가능한 세 가지 수준을 사용합니다. 라틴어 스크립트의 경우이 수준은 대략 다음과 같습니다.
alphabetic ordering
diacritic ordering
case ordering.
그러나 알고리즘 자체는 약간 조밀합니다. 그 요지는 다음 바와 짧게 유니 코드 문자 정렬 알고리즘을위한지도 데이터를 포함하는 입력의 유니 코드 문자열 대조 요소 테이블을 걸린다. 부호없는 16 비트 정수의 배열 인 정렬 키를 생성합니다. 이렇게 생성 된 둘 이상의 정렬 키는 이진 비교되어 생성 된 문자열을 정확하게 비교할 수 있습니다.
특정 라틴어 정렬 규칙은 여기 ( http://developer.mimer.com/collations/charts/latin.htm)
이상
에서 볼 수 있습니다 . 0409.1252.Latin1_General_CS_AS.html
를 들어 e
캐릭터 그것을 보여줍니다 :
e E É è È ê Ê ë Ë
이것은 col1
코드 페이지 1252에 ē가 존재하지 않는다는 점을 제외하고 주문할 때의 결과를 설명 하므로 그 기능에 대한 아이디어는 전혀 없습니다.
또는 직접 유니 코드 알고리즘을 수행하는 경우 http://www.unicode.org/Public/UCA/latest/allkeys.txt 에서 DUCET의 키 값을 사용 하십시오 .
1 단계 : 정규화 양식 D이므로 각 경우는 다음과 같습니다.
e => U+0065
é => U+0065 U+0301
ë => U+0065 U+0308
è => U+0065 U+0300
ê => U+0065 U+0302
ē => U+0065 U+0304
2 단계, 데이터 정렬 배열 생성 (파일에서 조회 allkeys.txt
)
e => [.1D10.0020.0002]
é => [.1D10.0020.0002] [.0000.0024.0002]
ë => [.1D10.0020.0002] [.0000.002B.0002]
è => [.1D10.0020.0002] [.0000.0025.0002]
ê => [.1D10.0020.0002] [.0000.0027.0002]
ē => [.1D10.0020.0002] [.0000.0032.0002]
3 단계, 양식 정렬 키 (각 레벨에 대해 각 조합 배열 내에서 각 값을 가져 와서 0000을 분리 문자로두고 다음 레벨에서 다시 시작)
e => 1D10 0000 0020 0000 0002
é => 1D10 0000 0020 0024 0000 0002 0002
ë => 1D10 0000 0020 002B 0000 0002 0002
è => 1D10 0000 0020 0025 0000 0002 0002
ê => 1D10 0000 0020 0027 0000 0002 0002
ē => 1D10 0000 0020 0032 0000 0002 0002
4 단계, 정렬 키 비교 (각 값을 하나씩 간단하게 이진 비교) : 네 번째 값은 모두 정렬하기에 충분하므로 최종 순서는 다음과 같습니다.
e
é
è
ê
ë
ē
주문과 같은 방법으로 col2
:
1 단계 : NFD
eA => U+0065 U+0041
éB => U+0065 U+0301 U+0042
ëC => U+0065 U+0308 U+0043
èD => U+0065 U+0300 U+0044
êE => U+0065 U+0302 U+0045
ēF => U+0065 U+0304 U+0046
2 단계 : 콜 레이션 배열
eA => [.1D10.0020.0002] [.1CAD.0020.0008]
éB => [.1D10.0020.0002] [.0000.0024.0002] [.1CC6.0020.0008]
ëC => [.1D10.0020.0002] [.0000.002B.0002] [.1CE0.0020.0008]
èD => [.1D10.0020.0002] [.0000.0025.0002] [.1CF5.0020.0008]
êE => [.1D10.0020.0002] [.0000.0027.0002] [.1D10.0020.0008]
ēF => [.1D10.0020.0002] [.0000.0032.0002] [.1D4B.0020.0008]
3 단계 : 양식 정렬 키
eA => 1D10 1CAD 0000 0020 0020 0000 0002 0008
éB => 1D10 1CC6 0000 0020 0024 0020 0000 0002 0002 0008
ëC => 1D10 1CE0 0000 0020 002B 0020 0000 0002 0002 0008
èD => 1D10 1CF5 0000 0020 0025 0020 0000 0002 0002 0008
êE => 1D10 1D10 0000 0020 0027 0020 0000 0002 0002 0008
ēF => 1D10 1D4B 0000 0020 0032 0020 0000 0002 0002 0008
4 단계 : 정렬 키 비교 : 두 번째 값은 모두 정렬하기에 충분하며 실제로 이미 증가하는 순서이므로 최종 순서는 실제로 다음과 같습니다.
eA
éB
ëC
èD
êE
ēF
업데이트 : Solomon Rutzky 세 번째 사례 추가 : 새로운 규칙을 사용할 수있는 공간 때문에 까다로워졌습니다 ( "무시할 수없는 사례"를 선택했습니다).
1 단계, NFD :
è 1 => U+0065 U+0300 U+0020 U+0031
ê 5 => U+0065 U+0302 U+0020 U+0035
e 2 => U+0065 U+0020 U+0032
é 4 => U+0065 U+0301 U+0020 U+0034
ē 3 => U+0065 U+0304 U+0020 U+0033
ë 6 => U+0065 U+0308 U+0020 U+0036
2 단계, 콜 레이션 배열 생성 :
è 1 => [.1D10.0020.0002] [.0000.0025.0002] [*0209.0020.0002] [.1CA4.0020.0002]
ê 5 => [.1D10.0020.0002] [.0000.0027.0002] [*0209.0020.0002] [.1CA8.0020.0002]
e 2 => [.1D10.0020.0002] [*0209.0020.0002] [.1CA5.0020.0002]
é 4 => [.1D10.0020.0002] [.0000.0024.0002] [*0209.0020.0002] [.1CA7.0020.0002]
ē 3 => [.1D10.0020.0002] [.0000.0032.0002] [*0209.0020.0002] [.1CA6.0020.0002]
ë 6 => [.1D10.0020.0002] [.0000.002B.0002] [*0209.0020.0002] [.1CA9.0020.0002]
3 단계, 양식 정렬 키 :
è 1 => 1D10 0209 1CA4 0000 0020 0025 0020 0020 0000 0002 0002 0002 0002
ê 5 => 1D10 0209 1CA8 0000 0020 0027 0020 0020 0000 0002 0002 0002 0002
e 2 => 1D10 0209 1CA5 0000 0020 0020 0020 0000 0002 0002 0002
é 4 => 1D10 0209 1CA7 0000 0020 0024 0020 0020 0000 0002 0002 0002 0002
ē 3 => 1D10 0209 1CA6 0000 0020 0032 0020 0020 0000 0002 0002 0002 0002
ë 6 => 1D10 0209 1CA9 0000 0020 002B 0020 0020 0000 0002 0002 0002 0002
4 단계, 정렬 키 비교 :
기본적으로 세 번째 값은 순서를 결정하며 실제로는 마지막 숫자만을 기준으로하므로 순서는 다음과 같아야합니다.
è 1
e 2
ē 3
é 4
ê 5
ë 6
유니 코드 버전에 대한 Solomon Rutzky의 의견을 기반으로 한 두 번째 업데이트 .
현재 allkeys.txt
최신 유니 코드 버전, 즉 버전 10.0에 대한 데이터를 사용했습니다.
대신 유니 코드 5.1 을 고려해야하는 경우 다음과 같습니다.
http://www.unicode.org/Public/UCA/5.1.0/allkeys.txt
위의 모든 문자에 대해 데이터 정렬 배열이 대신 다음과 같이 확인되었습니다.
e => [.119D.0020.0002.0065]
é => [.119D.0020.0002.0065] [.0000.0032.0002.0301]
ë => [.119D.0020.0002.0065] [.0000.0047.0002.0308]
è => [.119D.0020.0002.0065] [.0000.0035.0002.0300]
ê => [.119D.0020.0002.0065] [.0000.003C.0002.0302]
ē => [.119D.0020.0002.0065] [.0000.005B.0002.0304]
과:
eA => [.119D.0020.0002.0065] [.1141.0020.0008.0041]
éB => [.119D.0020.0002.0065] [.0000.0032.0002.0301] [.1157.0020.0008.0042]
ëC => [.119D.0020.0002.0065] [.0000.0047.0002.0308] [.116F.0020.0008.0043]
èD => [.119D.0020.0002.0065] [.0000.0035.0002.0300] [.1182.0020.0008.0044]
êE => [.119D.0020.0002.0065] [.0000.003C.0002.0302] [.119D.0020.0008.0045]
ēF => [.119D.0020.0002.0065] [.0000.005B.0002.0304] [.11D5.0020.0008.0046]
과:
è 1 => [.119D.0020.0002.0065] [.0000.0035.0002.0300] [*0209.0020.0002.0020] [.1138.0020.0002.0031]
ê 5 => [.119D.0020.0002.0065] [.0000.003C.0002.0302] [*0209.0020.0002.0020] [.113C.0020.0002.0035]
e 2 => [.119D.0020.0002.0065] [*0209.0020.0002.0020] [.1139.0020.0002.0032]
é 4 => [.119D.0020.0002.0065] [.0000.0032.0002.0301] [*0209.0020.0002.0020] [.113B.0020.0002.0034]
ē 3 => [.119D.0020.0002.0065] [.0000.005B.0002.0304] [*0209.0020.0002.0020] [.113A.0020.0002.0033]
ë 6 => [.119D.0020.0002.0065] [.0000.0047.0002.0308] [*0209.0020.0002.0020] [.113D.0020.0002.0036]
그런 다음 다음 정렬 키로 계산합니다.
e => 119D 0000 0020 0000 0002 0000 0065
é => 119D 0000 0020 0032 0000 0002 0002 0000 0065 0301
ë => 119D 0000 0020 0047 0000 0002 0002 0000 0065 0308
è => 119D 0000 0020 0035 0000 0002 0002 0000 0065 0300
ê => 119D 0000 0020 003C 0000 0002 0002 0000 0065 0302
ē => 119D 0000 0020 005B 0000 0002 0002 0000 0065 0304
과:
eA => 119D 1141 0000 0020 0020 0000 0002 0008 0000 0065 0041
éB => 119D 1157 0000 0020 0032 0020 0000 0002 0002 0008 0000 0065 0301 0042
ëC => 119D 116F 0000 0020 0047 0020 0000 0002 0002 0008 0000 0065 0308 0043
èD => 119D 1182 0000 0020 0035 0020 0000 0002 0002 0008 0000 0065 0300 0044
êE => 119D 119D 0000 0020 003C 0020 0000 0002 0002 0008 0000 0065 0302 0045
ēF => 119D 11D5 0000 0020 005B 0020 0000 0002 0002 0008 0000 0065 0304 0046
과:
è 1 => 119D 0209 1138 0000 0020 0035 0020 0020 0000 0002 0002 0002 0002 0000 0065 0300 0020 0031
ê 5 => 119D 0209 113C 0000 0020 003C 0020 0020 0000 0002 0002 0002 0002 0000 0065 0302 0020 0035
e 2 => 119D 0209 1139 0000 0020 0020 0020 0000 0002 0002 0002 0000 0065 0020 0032
é 4 => 119D 0209 113B 0000 0020 0032 0020 0020 0000 0002 0002 0002 0002 0000 0065 0301 0020 0034
ē 3 => 119D 0209 113A 0000 0020 005B 0020 0020 0000 0002 0002 0002 0002 0000 0065 0304 0020 0033
ë 6 => 119D 0209 113D 0000 0020 0047 0020 0020 0000 0002 0002 0002 0002 0000 0065 0308 0020 0036
이 세 가지 정렬 된 결과가 다시 나타납니다.
e
é
è
ê
ë
ē
과
eA
éB
ëC
èD
êE
ēF
과
è 1
e 2
ē 3
é 4
ê 5
ë 6
VARCHAR
. 여기서는 사용되지 않는 유니 코드가 아닌 데이터 용입니다. 그래서ē
캐릭터가 잘 작동합니다. 2) "collation-charts"정보는 약간 구식입니다. 이 Collation의 이전 버전을위한 것이며 2009 년 이후로 아무것도 게시하지 않았습니다. 3) 여기서 유니 코드 버전은 확실히 최신 버전이 아닙니다 (버전 10)._100_
이 유니 코드 5.0 또는 5.1 될 수 있도록 일련의 데이터 정렬은 SQL 2008와 함께 unicode.org/standard/versions/#TUS_Earlier_Versions