Domanda

La domanda è di circa armena. Sto utilizzando sql server 2005, collazione SQL_Latin1_General_CP1_CI_AS, i dati è per lo più in armeno e non possiamo utilizzare unicode.

Ho testato su MS SQL 2008 con un confronto di Windows per la lingua armena (Cyrillic_General_100_), ho trovato qui, ( http://msdn.microsoft.com/en-us/library/ms188046.aspx ), ma non ha aiutato.

Ho una funzione, che i valori ordini esadecimali e una funzione inferiore, che prende ogni carattere in ogni stringa e converte alla sua forma inferiore, ma non è una soluzione accettabile, funziona molto lento, chiamando che le funzioni di ogni colonna di un tavolo enorme.

C'è una soluzione per questo problema non utilizzando Unicode e non lavorare con valori esadecimali manualmente?

UPDATE:

Nella parte sinistra sono parole di casi misti, ordinate nel giusto ordine e con casi di rappresentazioni inferiori sul lato destro. Spero che questo vi aiuterà. Grazie. Le parole sono scritte in unicode.

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

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

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

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

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

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

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

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

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

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

È stato utile?

Soluzione

Una soluzione sarebbe quella di creare una colonna calcolata per ogni colonna di testo che converte il valore nella collazione armeno e lo imposta a minuscolo in questo modo:

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

Una volta fatto questo, è possibile inserire indici su queste colonne e query per loro.

Se questo non è il vostro sapore del tè, poi un'altra soluzione sarebbe una vista indicizzata in cui si crea una visualizzazione con SCHEMABINDING che getta ciascuna delle varie colonne in minuscolo e per le regole di confronto a destra e poi mettere indici su quella vista .

Modifica Ho notato nei tuoi esempi, che si sta usando un case-insensitive, Accent-sensibili. Forse la semplice soluzione ai vostri problemi di ordinazione sarebbe quella di utilizzare Latin1_General_CS_AS o Cyrillic_General_100_CS_AS se disponibile.

Modifica

Accidenti. Dopo un bel po 'di ricerca, credo di avere una risposta che, purtroppo, non può essere che si vuole. In primo luogo, sì, posso copiare il testo che hai fornito in codice o qualcosa del genere Notepad ++ perché StackOverflow è codificati con UTF-8 e armeno si inserisce in UTF-8. In secondo luogo, questo allude a ciò che si sta cercando di ottenere: l'archiviazione UTF-8 in SQL Server. Purtroppo, SQL Server 2008 (o qualsiasi versione precedente) non supporta nativamente UTF-8. Al fine di memorizzare i dati in UTF-8, si dispone di una manciata di scelte:

  1. conservarlo in binario e convertirlo in UTF-8 sul client (che elimina praticamente qualsiasi ordinamento fatto sul server)
  2. conservarlo in Unicode e convertirlo in UTF-8 sul client. Va notato che il driver di SQL Server sarà già convertire la maggior parte le stringhe in Unicode e il tuo esempio non funzionare bene in Unicode. Il rovescio della medaglia evidente è che si mangia due volte lo spazio.
  3. Crea un tipo definito dall'utente CLR in SQL Server per archiviare UTF-8 valori. Microsoft fornisce un esempio che viene fornito con SQL Server di fare proprio questo. È possibile scaricare i campioni da CodePlex da qui . È inoltre possibile trovare ulteriori informazioni sul campione in questo articolo del documentazione in linea . Il rovescio della medaglia è che bisogna avere il CLR attivato in SQL Server e io non sono sicuro di come esso deve svolgere.

Ora, detto questo, sono stato in grado di farti assaggiare lavorare senza alcun problema utilizzando Unicode in 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)

Tutti e tre di queste query restituire lo stesso risultato.

Altri suggerimenti

Hai ricevuto un errore come questo?

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

Prova:

ORDER BY Name COLLATE Cyrillic_General_100_CI_AS

o sceglierne uno che preferite da questa lista:

select * from fn_helpcollations()
where name like 'Cyrillic_General_100_%'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top