Cosa significa collation?


138

Cosa significa collation in SQL e cosa fa?


2
@gbn: Per inciso, le regole di confronto funzionano in modo molto simile sia in MSSQL che MySQL.
Piskvor lasciò l'edificio il


@Piskvor: Tranne alcune delle opzioni di confronto mySql (ad es. UTF8) non sono disponibili in MSSQL: msdn.microsoft.com/en-us/library/ms144250.aspx
CB

@CB: non negarlo; la somiglianza è più profonda dei (non) set di caratteri supportati.
Piskvor lasciò l'edificio

Risposte:


60

La collazione può essere semplicemente considerata come un ordinamento.

In inglese (ed è strano cugino, americano), le regole di confronto possono essere una questione piuttosto semplice che consiste nell'ordinare con il codice ASCII.

Una volta entrati in quelle strane lingue europee con tutti i loro accenti e altre caratteristiche, le regole di confronto cambiano. Ad esempio, anche se le diverse forme accentate dia possano esistere in punti di codice disparati, potrebbe essere necessario ordinarle tutte come se fossero la stessa lettera.


4
Accenti diversi di solito significa che hanno bisogno di essere ordinati come se fossero diverse lettere - per esempio e, ë, é, ě, e è potrebbe essere lettere distinte ai fini di ordinamento (ma forse la stessa lettera durante la ricerca, accidenti a quei folli europei;)).
Piskvor lasciò l'edificio il

1
@Piskvor: le coordinate nelle tue informazioni non indicano un determinato paese usando un alfabeto con 42lettere, 15di cui hanno segni diacritici?
Quassnoi,

4
@Quassnoi: bene sì, e? Sto insinuando da qualche parte che non sono pazzo? ; o) (anche se grazie a Dio per Unicode, sarei completamente pazzo se dovessi ancora lavorare con i set di caratteri specifici della nazione)
Piskvor lasciò l'edificio il

3
@Piskvor: scusa, scusa, sei perfettamente pazzo! :)
Quassnoi,

È solo per l'ordinamento o anche per where st= 'aaa'?
Royi Namir il

42

Oltre alle "lettere accentate sono ordinate in modo diverso da quelle non accentate" in alcune lingue dell'Europa occidentale, è necessario tenere conto dei gruppi di lettere, che a volte sono anche ordinate in modo diverso.

Tradizionalmente, in spagnolo, "ch" era considerato una lettera a sé stante, lo stesso con "ll" (entrambi rappresentano un singolo fonema), quindi un elenco verrebbe ordinato in questo modo:

  • caballo
  • cinco
  • coche
  • charco
  • cioccolato
  • chueco
  • dado
  • (...)
  • lámpara
  • luego
  • llanta
  • lluvia
  • madera

Notice tutte le parole che iniziano con singoli c vanno insieme, tranne parole che iniziano con ch che vanno dopo di loro, lo stesso con ll scaglionamento parole che vanno dopo tutte le parole che iniziano con un singolo l . Questo è l'ordine che vedrai nei vecchi dizionari ed enciclopedie, a volte anche oggi da organizzazioni molto conservatrici.

La Royal Academy of the Language ha cambiato questo per rendere più semplice l'accoglienza dello spagnolo nel mondo dell'informatica. Tuttavia, ñ è ancora considerata una lettera diversa da n e va dopo di esso, e prima o . Quindi questo è un elenco ordinato correttamente:

  • Namibia
  • número
  • ñandú
  • Ñú
  • obra
  • ojo

Selezionando la raccolta corretta, ottieni tutto ciò che fa per te, automaticamente :-)


OK, quindi un confronto è abbastanza utile per l'ordinamento corretto, ma è ancora utile per i confronti? Ad esempio, vorrei che "ñandú" e "nandu" fossero uguali, per motivi pratici ... Il meccanismo di fascicolazione potrebbe aiutarmi in questo compito?
CB,

@CB: Se vuoi dire qualcosa come selezionare tutte le righe in cui il valore di una colonna è uguale a 'Aéreo' e SQL S. restituisce le righe con 'aereo', 'aereó', 'AerEO' e simili - sì, impostando un confronto specifico solo per un la query può farlo. Avrai problemi di prestazioni, tuttavia, se questo confronto è molto diverso da quello nativo del database. E se usi tabelle temporanee, devi anche tenere traccia delle regole di confronto di tempdb ... Ma puoi farlo.
Joe Pineda,

In tal caso, potresti spiegarmi un po 'di più? In particolare, la semplice query "SELEZIONA parola DA test DOVE la parola COME 'nandu'" sarebbe in grado di farlo? E quale raccolta dovrei usare per farlo funzionare? (Nota che sono preoccupato per i segni diacritici e non solo per gli accenti ...)
CB

2
@CB dai un'occhiata alla parte 'AI' o 'AS' della raccolta (Accent Insensitive e Accent Sensitive).
Dustin Kendall,

14

Regole che indicano come confrontare e ordinare le stringhe: ordine delle lettere; se il caso conta, se i segni diacritici contano ecc.

Ad esempio, se vuoi che tutte le lettere siano diverse (ad esempio, se memorizzi i nomi dei file UNIX), usi le UTF8_BINregole di confronto:

SELECT  'A' COLLATE UTF8_BIN = 'a' COLLATE UTF8_BIN

---
0

Se si desidera ignorare le differenze tra maiuscole e minuscole (ad esempio per un motore di ricerca), utilizzare le UTF8_GENERAL_CIregole di confronto:

SELECT  'A' COLLATE UTF8_GENERAL_CI = 'ä' COLLATE UTF8_GENERAL_CI

---
1

Come puoi vedere, questa collazione (regola di confronto) considera maiuscole Ae minuscole äla stessa lettera, ignorando le differenze maiuscole e diacritiche.


10

Le regole di confronto definiscono il modo in cui ordinare e confrontare i valori di stringa

Ad esempio, definisce come affrontare

  • accenti ( äàaecc.)
  • case ( Aa)
  • il contesto linguistico:
    • In una collazione francese, cote < côte < coté < côté.
    • Nell'impostazione predefinita di SQL Server Latin1, cote < coté < côte < côté
  • Ordinamento ASCII (un confronto binario)

5

Fascicolazione significa assegnare un certo ordine ai personaggi di un alfabeto, ad esempio ASCII o Unicode ecc.

Supponi di avere 3 caratteri nel tuo alfabeto - {A, B, C}. È possibile definire alcuni esempi di regole di confronto assegnando valori integrali ai caratteri

  1. Esempio 1 = {A = 1, B = 2, C = 3}
  2. Esempio 2 = {C = 1, B = 2, A = 3}
  3. Esempio 3 = {B = 1, C = 2, A = 3}

È un dato di fatto, è possibile definire n! regole di confronto su un alfabeto di dimensione n. Dato un tale ordine, diverse routine di ordinamento come LSD / MSD fanno uso di stringhe per ordinarle.


3

Le regole di confronto determinano il modo in cui i dati vengono ordinati e confrontati. Molto spesso è importante per quanto riguarda l'internazionalizzazione, ad es. Come si classificano i kanji giapponesi?

Se hai collation google e server sql troverai molti articoli che ne parlano!


3

Il riferimento è tratto da questo articolo: una raccolta è un insieme di regole per confrontare i caratteri in un set di caratteri. Ha inoltre stabilito l'ordinamento dei caratteri e l'ordine corretto di due caratteri varia da lingua a lingua. Una collazione confronta due stringhe come, se una parola è maggiore di un'altra, e ordina di conseguenza.

Se si utilizza il set di caratteri "latin1", è possibile utilizzare la collation "latin1_swedish_ci".

È necessario scegliere le regole di confronto corrette perché le regole di confronto errate possono influire sulle prestazioni del database.


2

http://en.wikipedia.org/wiki/Collation

La raccolta è l'assemblaggio di informazioni scritte in un ordine standard. (...) Un algoritmo di confronto come l' algoritmo di confronto Unicode definisce un ordine attraverso il processo di confronto tra due stringhe di caratteri e decidendo quale dovrebbe venire prima dell'altro.



1
Questo articolo spiega davvero tutto.
Joe Pineda,

3
@Joe Pineda. Forse lo spiega davvero tutto, ma il lettore vuole sapere tutto? O è possibile che il lettore desideri semplicemente una risposta concisa e affidabile che copra gli elementi e le funzioni di confronto più fondamentali e di uso comune in modo che possa leggerlo rapidamente e riprendere a lavorare su qualsiasi compito, incarico o progetto abbia sollevato la domanda di iniziare con?
cfwschmidt,

2
@TJCrowder Apprezzo l'ironia in questo

1

Il confronto è il modo in cui SQL Server decide come ordinare e confrontare il testo.

Vedi MSDN .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.