2012-03-18 10 views
10

Ho letto molto su questo.Qual è il punto di COLLATIONS per le colonne nvarchar (Unicode)?

ancora alcune domande:

Non sto parlando di maiuscole e minuscole qui ...

  • Se ho un char (ש per esempio) e che viene memorizzato in nvarchar - che può contenere qualsiasi cosa Perché dovrei aver bisogno di collation qui?

  • Se io sono "Facebook" e ho bisogno la possibilità di memorizzare all caratteri da all lingue, qual è il rapporto tra la raccolta e mie colonne nvarchar?

Grazie in anticipo.

+5

Un confronto non [direttamente] dice cosa può essere memorizzato. Una collazione determina l'ordinamento e l'uguaglianza. Ad esempio, alcune regole di confronto non fanno distinzione tra maiuscole e minuscole o insensibili agli accenti mentre altre no. –

+0

@ pst se ho memorizzato 'ש' e faccio 'ordinare', quindi dovrebbe ordinare per i suoi caratteri che include' ש'. .....no ? –

+0

@ user166390 "Un confronto non [direttamente] dice cosa può essere memorizzato." non è completamente vero È vero solo per i campi 'NVARCHAR' /' NCHAR'. Per i campi 'VARCHAR' e' CHAR', la collazione determina in effetti ciò che può essere memorizzato lì poiché contiene la LCID che determina la pagina di codice. –

risposta

8

Memorizzare e rappresentare i caratteri è una cosa, e sapere come ordinarli e confrontarli è un altro.

i dati Unicode, memorizzati nei XML e N tipi -prefixed in SQL Server, possono rappresentare tutti i caratteri di tutte le lingue (per la maggior parte, e che è il suo obiettivo) con un unico set di caratteri. Quindi per i dati XML/NCHAR/NVARCHAR (sto lasciando fuori NTEXT come non dovrebbe più essere utilizzato), le regole di confronto non cambiano i caratteri che possono essere memorizzati. Per CHAR e VARCHAR i dati, le regole di confronto fanno influenzano ciò che può essere memorizzato come ogni punto di confronto da un particolare codice pagina, che determina ciò che può essere memorizzato in valori 128 - 255.

Ora, mentre v'è una sorta di default ordine per tutti i personaggi, che non può funzionare in tutte le lingue e culture. Esistono molte lingue che condividono alcuni/molti/tutti i caratteri, ma hanno regole diverse su come ordinarli. Ad esempio, la lettera "C" viene prima della lettera "D" nella maggior parte degli alfabeti che usano quelle lettere. Nell'inglese americano, una combinazione di "C" e "H" (cioè "CH" come due lettere separate) verrebbe naturalmente prima di ogni stringa che inizia con una "D".Ma, in alcune lingue, il due lettere combinazione di "CH" è speciale e ordina dopo "D":

IF ( N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI 
    AND N'C' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI 
    AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI 
    ) PRINT 'Czech_CI_AI'; 

IF ( N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI 
    AND N'C' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI 
    AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI 
    ) PRINT 'Czech_100_CI_AI'; 

IF ( N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI 
    AND N'C' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI 
    AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI 
    ) PRINT 'Slovak_CI_AI'; 

IF ( N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS 
    AND N'C' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS 
    AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS 
    ) PRINT 'Slovak_CS_AS'; 

IF ( N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS 
    AND N'C' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS 
    AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS 
    ) PRINT 'Latin1_General_100_CI_AS' 
ELSE PRINT 'Nope!'; 

Returns:

Czech_CI_AI 
Czech_100_CI_AI 
Slovak_CI_AI 
Slovak_CS_AS 
Nope! 

Per vedere esempi di regole di ordinamento attraverso varie culture, vedere: Collation Charts.

Inoltre, in alcune lingue alcune lettere o combinazioni di lettere corrispondono ad altre lettere in modi che non fanno nella maggior parte delle altre lingue. Ad esempio, solo in danese un "å" equivale a "aa". Ma, la "a" non equivale a un solo "a":

IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI = N'å' COLLATE Danish_Greenlandic_100_CI_AI 
AND N'a' COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI 
    ) PRINT 'Danish_Greenlandic_100_CI_AI'; 

IF ( N'aa' COLLATE Danish_Norwegian_CI_AI = N'å' COLLATE Danish_Norwegian_CI_AI 
    AND N'a' COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI 
    ) PRINT 'Danish_Norwegian_CI_AI'; 

IF ( N'aa' COLLATE Latin1_General_100_CI_AI = N'å' COLLATE Latin1_General_100_CI_AI 
    AND N'a' COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI 
    ) PRINT 'Latin1_General_100_CI_AI' 
ELSE PRINT 'Nope!'; 

Ritorni:

Danish_Greenlandic_100_CI_AI 
Danish_Norwegian_CI_AI 
Nope! 

Tutto questo è molto complesso, e non ho nemmeno menzionato la gestione per destra lingue a sinistra (ebraico e arabo), cinese, giapponese, combinazione di caratteri, ecc.

Se si desidera una conoscenza approfondita delle regole, consultare lo Unicode Collation Algorithm (UCA). Gli esempi sopra riportati si basano su esempi in tale documentazione, sebbene non ritenga che tutte le regole nell'UCA siano state implementate, specialmente dal momento che le regole di confronto di Windows (fascicoli non a partire da SQL_) si basano su Unicode 5.0 o 6.0, a seconda sul sistema operativo in uso e la versione di .NET Framework installata (consultare SortVersion per i dettagli).

Quindi questo è ciò che fanno le Collations. Se si desidera visualizzare tutte le raccolte disponibili, è sufficiente eseguire quanto segue:

SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name]; 
6

Se si dispone di un carattere, non c'è alcun ordine. Ma se ordini per esempio NOMI di PERSONE - diversi caratteri speciali in diverse lingue sono ordinati in modo diverso a seconda delle regole di confronto.

Per prima cosa una distinzione può essere sensibile al maiuscolo/minuscolo - mostrare tutti i B prima di b - ei secondi caratteri speciali hanno regole speciali in base al confronto.

La documentazione è piuttosto buona.

+0

Come può sql ordinare inglese, arabo, ebraico insieme? non esiste una logica comune ...? per favore spiega –

+0

Puoi, se sei ignorante. E usare ad esempio l'ordine forte inglese ovunque. Saldamente questo non è necessariamente corretto. http://www.sqlservercentral.com/blogs/rocks/2012/01/09/revised-difference-between-collation-sql_latin1_general_cp1_ci_and-and-latin1_general_ci_as/ ha un esempio (spagnolo). Pensi che gli MS siano idioti? http://msdn.microsoft.com/en-us/library/ms144250.aspx ha tutte le regole di confronto e molte sono specifiche specifiche. Pensi che lo facciano senza una ragione? No, per esempio la posizione dei caratteri speciali nell'ordinamento dipende dalla lingua. – TomTom

6

Penso che il poster originale si confonda tra le PAGINE DEL CODICE e le COLLAZIONI.

La "n" in nvarchar/nchar consente di memorizzare il testo utilizzando il set di numeri unicode che è abbastanza grande da incorporare tutti i caratteri in tutte le lingue (in linea di principio comunque) con un numero univoco. Questo non è correlato alle regole di confronto. nvarchar/nchar non usa CODE PAGINE per codificare/decodificare il significato di ciascun codice di carattere.

Le regole di confronto definiscono l'ordinamento dei caratteri e quali varianti di carattere devono essere considerate identiche. nvarchar/nchar usa COLLATIONS per definire queste distinzioni.