기본적으로 데이터베이스를 사용하는 다른 로케일을 가진 사용자가 있으며 기본 순서로 정렬 된 항목을 가져 오도록하고 싶습니다.SQL 서버의 로케일 인식 정렬
나의 이해는이 같은 작품이다 :
문자 인코딩 (ISO, 유니 코드, 코드 페이지 등) :
이 무엇을 제한 I 데이터베이스를 만들 때내가 결정해야 문자를 데이터베이스에 입력 할 수 있습니다.
물리적 저장 장치 (바이너리, UTF-8, UCS16 엔디안 등) :
이것은 내가 신뢰할 수있는 것입니다. 전자 데이터베이스평등 비교 :
이것은 고유 한 제약 등이 데이터베이스에서 일관되게 작동해야합니다. 일반적으로 대소 문자를 구분하지 않아도됩니다 ("a"= "A")와 악센트 (è = e). 로케일 문제는 여기에 있습니까?
이 모든 것들 (+ 기본 정렬 순서가) 연결이 설정되면
(기본 인스턴스에서 기본을 얻는다 데이터베이스에서 제공) 각 필드의 정렬을 지정하여 설정 데이터베이스에 이르기까지 로그인 언어 설정은 날짜 및 숫자 표시 방법을 지정합니다.
여기가 문제가되는 곳입니다. 정렬 순서가 연결의 로캘에 따라 달라지는 이유는 무엇입니까? 평등 비교는 필드 사양을 따라야하지만 정렬 순서를 따라야한다는 것을 이해할 수 있습니까?
은 내가 ORDER BY [Name] COLLATE somecollation
할 수 있습니다 알고 있지만 몇 가지 문제는 그와 함께있다 :
- 는 SQL은 종종
- 가 어떻게 무엇을 알 수 있습니까 툴/프레임 워크에 의해 생성되는
- 을 잊기 쉽다 지정한 데이터 정렬?
정상적으로 어떻게 처리합니까? 클라이언트 측 정렬?
인덱스는 하나의 물리적 순서로만 정렬 할 수 있으므로 연결의 언어에서 데이터 정렬을 유추하면 다양한 수준의 효율성을 가진 다른 언어에 대한 실행 계획이 달라질 수 있습니다. 적어도 명백한'collate' 절 (당신이 성능에 영향을 미쳐 무언가를하고 있음을 분명히해야한다). –
좋습니다. 나는 (잘못) 텍스트 기반 인덱스가 해시/기수를 기반으로한다고 가정했다. 다른 사용자를위한 다른 실행 계획을 얻지는 않습니까? – adrianm
실제로는 언어가 계획 캐시 키로 사용됩니다 ('SELECT * FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_plan_attributes (plan_handle)'에서 볼 수 있듯이). 따라서 다른 계획이 큰 재앙의 대상이되지는 않습니다 공연. –