2011-10-15 2 views
2

기본적으로 데이터베이스를 사용하는 다른 로케일을 가진 사용자가 있으며 기본 순서로 정렬 된 항목을 가져 오도록하고 싶습니다.SQL 서버의 로케일 인식 정렬

나의 이해는이 같은 작품이다 :

  • 문자 인코딩 (ISO, 유니 코드, 코드 페이지 등) :
    이 무엇을 제한 I 데이터베이스를 만들 때

    내가 결정해야 문자를 데이터베이스에 입력 할 수 있습니다.

  • 물리적 저장 장치 (바이너리, UTF-8, UCS16 엔디안 등) :
    이것은 내가 신뢰할 수있는 것입니다. 전자 데이터베이스

  • 평등 비교 :
    이것은 고유 한 제약 등이 데이터베이스에서 일관되게 작동해야합니다. 일반적으로 대소 문자를 구분하지 않아도됩니다 ("a"= "A")와 악센트 (è = e). 로케일 문제는 여기에 있습니까?

이 모든 것들 (+ 기본 정렬 순서가) 연결이 설정되면

(기본 인스턴스에서 기본을 얻는다 데이터베이스에서 제공) 각 필드의 정렬을 지정하여 설정 데이터베이스에 이르기까지 로그인 언어 설정은 날짜 및 숫자 표시 방법을 지정합니다.

여기가 문제가되는 곳입니다. 정렬 순서가 연결의 로캘에 따라 달라지는 이유는 무엇입니까? 평등 비교는 필드 사양을 따라야하지만 정렬 순서를 따라야한다는 것을 이해할 수 있습니까?

은 내가 ORDER BY [Name] COLLATE somecollation 할 수 있습니다 알고 있지만 몇 가지 문제는 그와 함께있다 :

  1. 는 SQL은 종종
  2. 가 어떻게 무엇을 알 수 있습니까 툴/프레임 워크에 의해 생성되는
  3. 을 잊기 쉽다 지정한 데이터 정렬?

정상적으로 어떻게 처리합니까? 클라이언트 측 정렬?

+1

인덱스는 하나의 물리적 순서로만 정렬 할 수 있으므로 연결의 언어에서 데이터 정렬을 유추하면 다양한 수준의 효율성을 가진 다른 언어에 대한 실행 계획이 달라질 수 있습니다. 적어도 명백한'collate' 절 (당신이 성능에 영향을 미쳐 무언가를하고 있음을 분명히해야한다). –

+0

좋습니다. 나는 (잘못) 텍스트 기반 인덱스가 해시/기수를 기반으로한다고 가정했다. 다른 사용자를위한 다른 실행 계획을 얻지는 않습니까? – adrianm

+0

실제로는 언어가 계획 캐시 키로 사용됩니다 ('SELECT * FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_plan_attributes (plan_handle)'에서 볼 수 있듯이). 따라서 다른 계획이 큰 재앙의 대상이되지는 않습니다 공연. –

답변

0

데이터베이스 데이터 정렬은 SQL Server에 언어 공유에 따라 문자를 처리하는 방법을 알려줍니다.

그것은 당신의 정렬 설정에 따라 달라집니다 ("A"= "A") 여기에 문제 로케일과 악센트 (E = E) 것이다. ("a"= "A")는 사용자의 데이터 정렬이 대소 문자를 구분하지 않는 경우 (CI) 동일한 것으로 간주됩니다. (ai)

정렬 순서가 연결의 로캘에 따라 달라지는 이유는 무엇입니까? SQL Server는 데이터를 내부적으로 정렬해야하기 때문에 데이터 정렬 방법이 필요합니다.