뮤 티어 웹 사이트에 어떤 데이터 정렬을 선택해야합니까?


25

데이터 정렬이 쿼리 속도에 영향을 줍니까? 데이터 정렬에 따라 테이블 크기가 변경됩니까?

권장되는 데이터 정렬이 될 수있는 모든 가능한 언어 (예 : Google에 해당)를 지원해야하는 웹 사이트를 구축하려면?

와 같은 문자를 저장해야 日本語합니다. 웹 사이트를 통한 검색 somethingsóméthíng입력 을 반환 해야하며 대소 문자를 구분하지 않아야합니다.

어떤 것이 가장 좋은 선택인지 어떻게 알 수 있습니까? 이 사례에 더 적합한 데이터 정렬은 무엇입니까?


4
당신은 질문이 그렇게 주관적으로 들리지 않도록 질문을 바꾸고 싶을 것입니다. :)
TML

새로운 제목은 훨씬 더 잘 읽습니다
TML

답변:


16

일반적으로 유니 코드 변형 중 하나는 광범위한 언어 지원에 가장 적합 할 수 있습니다. UTF-8은 코드 포인트 당 더 적은 메모리를 사용하므로 시간 / 공간 상충 관계에서 약간의 이점이 있습니다. 그러나 UTF-8이 표현할 수없는 좀 더 난해한 언어 / 스크립트가 있다고 생각합니다 (그러나 100 % 확실하지는 않습니다.이 문제에 대해 철저한 연구를하지 않았습니다).

이 Wikipedia 기사 는 각각의 단점 / 장점을 밝히고 있습니다.


예, UTF-8은 110 만 유니 코드 코드 포인트를 처리 할 수 ​​있습니다.
vz0

감사합니다-UTF-8에서 지원되지 않는 Han 문자 등이 있다고 생각했는데 확실한 대답이 좋습니다.
TML


8

나는 (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.strxfrmReturns 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을 넘어선다고 생각한다. 항상 그렇듯이 특정 데이터베이스 시스템에 대한 설명서를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.