2010-03-30 2 views
3

질문은 아르메니아어에 대한 것입니다. 나는 SQL 서버 2005, 데이터 정렬 SQL_Latin1_General_CP1_CI_AS를 사용하고 있습니다. 데이터는 주로 아르메니아어로 유니 코드를 사용할 수 없습니다.비 유니 코드 데이터가 포함 된 SQL Server 2008의 ORDER BY, LOWER 사용 방법

아르메니아어 (Cyrillic_General_100_)에 대한 Windows 데이터 정렬을 사용하여 ms sql 2008에서 테스트했지만 여기 (http://msdn.microsoft.com/en-us/library/ms188046.aspx)에서 찾았지만 도움이되지 않았습니다.

나는 각 문자열의 각 문자를 가져 와서 더 낮은 형식으로 변환하는 16 진수 값과 하위 함수를 주문하는 함수를 가지고 있지만 수용할만한 솔루션은 아니다. 모든 열에서 그 함수를 호출하는 것이 매우 느리다. 거대한 테이블.

유니 코드를 사용하지 않고 16 진수 값을 수동으로 사용하지 않는이 문제에 대한 해결책이 있습니까?

UPDATE : 올바른 순서와 우측 하부 케이스 표현으로 정렬 왼쪽에서

혼합되는 경우 단어. 희망이 도움이 될 것입니다. 고맙습니다. 단어는 유니 코드로 쓰여 있습니다.

  1. ԱբԳդԵզ -> աբգդեզ

  2. ԱգԳսԴԼ -> ագգսդլ

  3. ԲաԴֆդԴ -> բադֆդդ

  4. ԳԳԼասա -> գգլասա

  5. ԴմմլօՏ -> դմմլօտ

  6. ԵլԲնՆն -> ելբննն

  7. ԶՎլուտ -> զվլուտ

  8. էԹփձջՐ -> էթփձջր

  9. ԸխԾդսՂ -> ըխծդսղ

  10. ԹԶէըԿր -> թզէըկր

+0

방금 ​​특정 텍스트 열의 데이터 정렬을 변경하려고 했습니까? – Gabe

+0

@gabe, 예, 가능했던 모든 일에 데이터 정렬을 변경했습니다. – hgulyan

+0

나는 여기에 오늘 유니콘을 * 유니콘 *으로 계속 읽었다 고 말했습니다. –

답변

3

하나의 솔루션 wo 아르메니아어 정렬로 값을 변환하여 각 텍스트 컬럼에 대한 계산 열을 만들 수 있고 그렇게처럼 소문자로 설정 ULD :이 작업을 수행하면, 당신이 그 (것)들을 위해 이러한 열 및 쿼리에 인덱스를 넣을 수 있습니다

Alter Table TableName 
    Add TextValueArmenian As (LOWER(TextColumn COLLATE Latin1_General_CI_AS)) PERSISTED 

.

차의 맛이 아니라면 또 다른 해결책은 SCHEMABINDING과 함께 다양한 열을 소문자 및 올바른 정렬로 캐스팅 한 다음 그 위에 인덱스를 넣는 뷰를 만드는 인덱싱 된 뷰가 될 것입니다 전망.

EDIT 예에서 대소 문자를 구분하지 않고 악센트를 구분합니다. 아마도 주문 문제에 대한 간단한 해결책은 가능한 경우 Latin1_General_CS_AS 또는 Cyrillic_General_100_CS_AS를 사용하는 것입니다.

편집

휴. 꽤 많은 연구 끝에 불행하게도 당신이 원하지 않는 대답을 가지고 있다고 생각합니다. 먼저 StackOverflow는 UTF-8을 사용하여 인코딩되고 Armenian은 UTF-8에 맞춰지기 때문에 코드 또는 Notepad ++와 같은 것으로 제공 한 텍스트를 복사 할 수 있습니다. 둘째, SQL Server에 UTF-8을 저장하는 방법을 알려줍니다. 아쉽게도 SQL Server 2008 (또는 이전 버전)은 UTF-8을 기본적으로 지원하지 않습니다. UTF-8로 데이터를 저장하기 위해, 당신은 선택의 소수가 : 바이너리에

  1. 스토어와
  2. (거의 모든 서버에서 수행 정렬이 제거 된) 클라이언트에서 UTF-8로 변환
  3. 유니 코드로 저장하고 클라이언트에서 UTF-8로 변환하십시오. SQL Server 드라이버는 이미 대부분의 문자열을 유니 코드로 변환하므로 예제가 유니 코드에서 제대로 작동한다는 점에 유의해야합니다. 명백한 단점은 그것이 두 배의 공간을 먹는다는 것이다.
  4. SQL Server에서 UTF-8 값을 저장할 CLR 사용자 정의 형식을 만듭니다. Microsoft는 SQL Server와 함께 제공되는 샘플을 제공합니다. CodePlex from here에서 샘플을 다운로드 할 수 있습니다. 이 기사의 샘플에 대한 자세한 내용은 Books Online에서 확인할 수도 있습니다. 단점은 SQL Server에서 CLR을 사용하도록 설정해야하며 성능이 얼마나 좋은지 잘 모르겠습니다.

이제는 SQL Server에서 유니 코드를 사용하여 문제없이 샘플 작업을 수행 할 수있었습니다.

If object_id('tempdb..#Test') Is Not Null 
    Drop Table #Test 
GO 
Create Table #Test 
(
    EntrySort int identity(1,1) not null 
    , ProperSort int 
    , MixedCase nvarchar(50) 
    , Lowercase nvarchar(50) 
) 
GO 
Insert #Test(ProperSort, MixedCase, Lowercase) 
Select 1, N'ԱբԳդԵզ',N'աբգդեզ' 
Union All Select 6, N'ԵլԲնՆն',N'ելբննն' 
Union All Select 2, N'ԱգԳսԴԼ',N'ագգսդլ' 
Union All Select 3, N'ԲաԴֆդԴ',N'բադֆդդ' 
Union All Select 4, N'ԳԳԼասա',N'գգլասա' 
Union All Select 5, N'ԴմմլօՏ',N'դմմլօտ' 
Union All Select 9, N'ԸխԾդսՂ',N'ըխծդսղ' 
Union All Select 7, N'ԶՎլուտ',N'զվլուտ' 
Union All Select 10, N'ԹԶէըԿր',N'թզէըկր' 
Union All Select 8,N'էԹփձջՐ',N'էթփձջր' 

Select * From #Test Order by ProperSort 
Select * From #Test Order by Lowercase 
Select * From #Test Order by Lower(MixedCase) 

이 세 가지 쿼리 모두 동일한 결과를 반환합니다.

+0

@Thomas, 네, 해결 방법입니다. 우리가 더 낮은 것에 대해서만 이야기한다면, 첫 번째 방법은 쉽지 않습니다. 이런 종류의 데이터를 가진 여러 개의 열이있는 테이블이 너무 많습니다. 심지어 최대 10 개까지 있습니다. db의,하지만보기를 쓰는 것이 더 나은 방법입니다. 테이블 구조는 변경되지 않습니다. 두 가지 더 있습니다. 1) SQL을 사용할 수 없습니다. 제대로 작동하지 않아서 armLower를 작성했습니다. 2) 주문은 어떻게하나요? 작동하지 않습니다. 솔루션은 더 낮은 값은 아니지만 열의 16 진수 값을 저장하고 16 진수 값을 변환하는 자체 함수를 사용하여 비교할 수 있습니다. – hgulyan

+0

@ 토마스,하지만 내 데이터로 더 낮고 순서를 사용하는 방법이 필요합니다. – hgulyan

+1

데이터 정렬은 열에서 ORDER BY 호출을 적절히 처리해야합니다. 데이터 정렬에는 여러 가지 변형이 있습니다 : 악센트 구분, 악센트 구분, 대소 문자 구분, 대소 문자 구분 등. 사용자가 언급 한 데이터 정렬은 대/소문자 구분 및 악센트 구분입니다.아마도 Cyrillic_General_100_CS_AS로 전환하면 문제가 해결 될까요? – Thomas

0

오류가 발생 했습니까?

Msg 448, Level 16, State 1, Line 1 
Invalid collation 'Cyrillic_General_100_'. 

시도 :

ORDER BY Name COLLATE Cyrillic_General_100_CI_AS 

또는 당신이 목록에서 선호 하나를 선택 :

select * from fn_helpcollations() 
where name like 'Cyrillic_General_100_%' 
+0

@ 피터, 나는 그것을 시도했지만 작동하지 않습니다. LOWER 및 ORDER BY는 아르메니아어 언어에서는 올바르게 작동하지 않습니다. – hgulyan

+0

필자는 필요에 따라 LOWER에서 db collation, table collation, collate를 쿼리에 추가하려고했지만 잘못된 결과를 얻습니다. SQL 서버에 armenian에 대한 해결책이 없다는 것이 가능합니까? – hgulyan

+0

일부 아르메니아어 (테이블 만들기, 값 삽입 등)를 게시하면 누군가가 찌를 수 있습니다. 결과가 나타나야하는 순서와 아래 양식을 포함시킵니다. –