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];
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. –
@ pst se ho memorizzato 'ש' e faccio 'ordinare', quindi dovrebbe ordinare per i suoi caratteri che include' ש'. .....no ? –
@ 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. –