Pergunta

A questão é sobre armênio. Estou usando o SQL Server 2005, COLATION SQL_LATIN1_GENERAL_CP1_CI_AS, os dados estão principalmente em armênios e não podemos usar o Unicode.

Eu testei no MS SQL 2008 com um agrupamento do Windows para a língua armênia (Cyrillic_general_100_), encontrei aqui ( http://msdn.microsoft.com/en-us/library/ms188046.aspx ) mas não ajudou.

Eu tenho uma função, que ordena valores hexadecimais e uma função mais baixa, que leva cada char em cada string e a converte em sua forma mais baixa, mas não é uma solução aceitável, funciona muito devagar, chamando essa função em todas as colunas de uma mesa enorme .

Existe alguma solução para esse problema não usar o Unicode e não trabalhar com valores hexadecimais manualmente?

ATUALIZAR:

No lado esquerdo, há palavras de caixa mista, classificadas na ordem direita e com representações minúsculas no lado direito. Espero que isso ajude. Obrigada. As palavras são escritas no Unicode.

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

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

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

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

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

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

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

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

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

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

Foi útil?

Solução

Uma solução seria criar uma coluna calculada para cada coluna de texto que converte o valor em agrupamento armênio e o define para a menor caixa assim:

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

Depois de fazer isso, você pode colocar índices nessas colunas e consultar para eles.

Se esse não é o seu sabor de chá, outra solução seria uma visão indexada onde você cria uma visão com SCHEMABINDING Isso lança cada uma das várias colunas para minúsculas e para o agrupamento correto e, em seguida, coloca índices nessa visão.

EDITAR Percebo em seus exemplos, que você está usando um caso insensível ao caso, sensível ao sotaque. Talvez a solução simples para seus problemas de pedidos seja usar latin1_general_cs_as ou cyrillic_general_100_cs_as, se disponível.

EDITAR

Ufa. Depois de uma pesquisa bastante, acho que tenho uma resposta que, infelizmente, pode não ser, você vai querer. Primeiro, sim, posso copiar o texto que você forneceu no código ou algo como o Notepad ++, porque o StackOverflow é codificado usando o UTF-8 e o Armenian se encaixará no UTF-8. Segundo, isso sugere o que você está tentando alcançar: armazenar o UTF-8 no SQL Server. Infelizmente, o SQL Server 2008 (ou qualquer versão anterior) não suporta nativamente o UTF-8. Para armazenar dados no UTF-8, você tem várias opções:

  1. Armazene-o em binário e converta-o para UTF-8 no cliente (que praticamente elimina qualquer classificação feita no servidor)
  2. Armazene-o no Unicode e converta-o para UTF-8 no cliente. Deve -se notar que o driver do SQL Server já converterá a maioria das strings para Unicode e seu exemplo funciona bem no Unicode. A desvantagem óbvia é que ela consome duas vezes o espaço.
  3. Crie um tipo de usuário CLR definido no SQL Server para armazenar valores UTF-8. A Microsoft fornece uma amostra que vem com o SQL Server para fazer exatamente isso. Você pode baixar as amostras de Codeplex a partir daqui. Você também pode encontrar mais informações sobre a amostra neste artigo no Livros online. A desvantagem é que você precisa ter o CLR ativado no SQL Server e não tenho certeza de quão bem ele será executado.

Agora, dito isso, consegui fazer uma amostra trabalhando sem problemas em usar o Unicode no 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)

Todas as três consultas retornam o mesmo resultado.

Outras dicas

Você recebeu um erro como este?

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

Tentar:

ORDER BY Name COLLATE Cyrillic_General_100_CI_AS

Ou escolha um que você prefere nesta lista:

select * from fn_helpcollations()
where name like 'Cyrillic_General_100_%'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top