나는 (2015-04-20, "Which collation [...]")에 언급 된 질문은 수용 된 답변이 데이터 정렬이 아닌 인코딩에 대해 이야기한다는 것을 의미하는 것이 아닙니다. 내가 생각하기에 단지 의도 된 것이 아니라 언급 된 질문에 대답하도록하겠습니다 :-)
Wikipedia는 "수집은 서면 정보를 표준 순서로 모은 것"이라고 말합니다. 컴퓨팅에서 데이터 정렬은 "이러한 순서의 지정"의 의미를 취했습니다. 즉, 데이터 정렬은 3 방향 비교 함수의 정의입니다.
나는 짧은 대답은 "확실히 아마"라고 생각합니다. 적어도 나는 다음과 같은 shenanigans를 알고 있습니다.
#!/usr/bin/python
name = u"Jonas K\xf6lker" # \xf6 is o-umlaut
enc = name.encode('utf-8')
assert len(name) == 12 # \xf6 is one character
assert len(enc) == 13 # but two bytes in utf-8
import locale
locale.setlocale(locale.LC_COLLATE, "da_DK.utf8") # works on my machine
long_form = locale.strxfrm(enc)
assert len(long_form) == 38
locale.strxfrm
즉 Returns a string that behaves for cmp locale-aware
, 비슷하게 인코딩 된 다른 문자열에 대한 바이트 별 표준 사전 사전 비교가 로케일에 의해 지정된 콜 레이션 함수에 따라 문자열을 비교하는 것과 동일한 결과를 생성하도록 문자열을 인코딩하는 함수입니다.
일부 관찰 :에서 da_DK.utf8
, 문자열 ouüö
이 정렬됩니다. 에서 de_DE.utf8
, 문자열이 oöuü
정렬됩니다. 참고 len(long_form) == 38
및 38> (13) (길이는 38이다 de_DE.utf8
.)
데이터베이스에에 따라 정렬 된 일부 문자열 필드에 대한 색인 이있는 경우 간단한 비교를 위해 내부적으로 비슷한 작업을 수행 da_DK.utf8
할 수 있습니다 strxfrm
. (반면에, 디스크는 느리다. 더 적은 문자를 비교하여 문자 당 비교 비용이 높을수록 오프셋보다 큰 경우, 더 컴팩트 한 표현에 기초하여 색인화하는 것이 더 빠를 수 있습니다.)
"데이터 정렬이 쿼리 속도에 영향을 줍니까?"라고 대답합니다. 대답은 예라고 확신합니다. "C"(일명 "POSIX") 데이터 정렬은 유니 코드 코드 포인트 값을 비교하는 반면 덴마크어 ( da_DK.utf8
) 및 독일어 ( de_DE.utf8
) 로캘은 더 까다로운 작업을 수행합니다. 이 것 좀 나는 그것이 가치가 걱정되지 않습니다 의심하지만, 쿼리 속도에 영향을.
"데이터 정렬에 따라 테이블 크기가 변경됩니까?" — 한 데이터 정렬에 따라 인덱스가 있고 다른 데이터 정렬에 따라 다른 인덱스가 있거나 두 가지 인덱스 중 하나 strxfrm
와 비슷한 변환이 적용되는 것을 상상할 수 있습니다 . 이 가상 시나리오에서 크기 특성이 다른 두 개의 데이터 정렬이 있으면 대답은 그렇습니다.
"추천 한 데이터 정렬은 무엇입니까?" — 문자열을 정렬해야하는 이유에 따라 다릅니다. 그것을 가지고 만 있다면 어떤 문자열을 주문의 표준 방법을, 나는 아마 "C"와 함께 갈 것입니다. 사용자의 기대에 따라 데이터를 정렬 된 순서로 사용자에게 제공하고 이러한 기대가 문화에 따라 결정되고 데이터베이스 (다른 계층이 아닌)가 정렬을 수행하려는 경우 데이터 정렬 당 하나의 인덱스를 작성해야합니다. 즉 da_DK.utf8
, 덴마크 인에게는 하나 이상 de_DE.utf8
, 독일인에게는 하나 이상 이다. 그래도 이것이 상당히 빨리 커질 것이라고 생각합니다.
이 모든 것은 데이터베이스의 내부 작업에 크게 의존합니다. 나는 그것이 "표준화 된"(lol!) SQL을 넘어선다고 생각한다. 항상 그렇듯이 특정 데이터베이스 시스템에 대한 설명서를 참조하십시오.