Che cosa fa "COLLATE SQL_Latin1_General_CP1_CI_AS"?


134

Ho una query SQL per creare il database in SQL Server come indicato di seguito:

create database yourdb
on
( name = 'yourdb_dat',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf',
  size = 25mb,
  maxsize = 1500mb,
  filegrowth = 10mb )
log on
( name = 'yourdb_log',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdblog.ldf',
  size = 7mb,
  maxsize = 375mb,
  filegrowth = 10mb )
COLLATE SQL_Latin1_General_CP1_CI_AS;
go

Funziona bene.

Mentre il resto dell'SQL è chiaro per essere, sono abbastanza confuso sulla funzionalità di COLLATE SQL_Latin1_General_CP1_CI_AS.

Qualcuno può spiegarmi questo? Inoltre, vorrei sapere se la creazione del database in questo modo è una buona pratica?

Risposte:


246

Imposta il modo in cui il server del database ordina (confronta i pezzi di testo). in questo caso:

SQL_Latin1_General_CP1_CI_AS

si divide in parti interessanti:

  1. latin1 fa in modo che il server tratti le stringhe usando charset latin 1, sostanzialmente ascii
  2. CP1 sta per Codice Pagina 1252
  3. CI confronti senza distinzione tra maiuscole e minuscole, quindi "ABC" equivarrebbe a "abc"
  4. AS sensibile all'accento, quindi "ü" non equivale a "u"

PS Per informazioni più dettagliate assicurati di leggere la risposta di @ solomon-rutzky .


11
Quale sarebbe la differenza tra questo e SQL_Latin1_General_CI_AS. In particolare, CP1 mi ha fatto riflettere.
Kad,

7
@Kad: non sembra esserci un SQL_Latin1_General_CI_AS. Piuttosto, c'è un Latin1_General_CI_AS. Vedere SELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');. Ci sono sottili differenze riguardo all'ordinamento e al confronto tra le due regole di confronto. Vedi olcot.co.uk/sql-blogs/… .
Riley Major,

4
@Kad: CP1 sta per Code Page 1252. Una code page è una tabella di ricerca per mappare il valore esadecimale su un carattere specifico in un set di caratteri. CP1 è una scorciatoia per CP1252 nella sottocultura Microsoft. Windows è l'unica piattaforma che utilizza CP1252 in modo autoctono in quanto è una sospensione dai giorni di DOS. Sebbene sia molto simile a ISO 8859-1, non sono gli stessi. Ci sono differenze nei caratteri mappati come l'euro e alcuni altri che non sono in ISO 8859-1.
slartibartfast

risposta impeccabile @Kris!
gaurav,

@Kris Esiste un'alternativa UTF-8 per SQL_Latin1_General_CP1_CI_AS in SQL2019?
Chanky,

72

Tieni presente che la risposta accettata è un po 'incompleta. Sì, al livello più elementare la fascicolazione gestisce l'ordinamento. MA, le regole di confronto definite dalla Fascicolazione scelta vengono utilizzate in molti punti al di fuori delle query degli utenti rispetto ai dati dell'utente.

Se "Cosa fa COLLATE SQL_Latin1_General_CP1_CI_AS?" significa "Cosa significa la COLLATEclausola CREATE DATABASE?", quindi:

La COLLATE {collation_name}clausola CREATE DATABASEdell'istruzione specifica le regole di confronto predefinite del database e non del server; Le regole di confronto predefinite a livello di database e di server controllano cose diverse.

Controlli di livello server (es. Istanza) :

  • A livello di database di confronto per database di sistema: master, model, msdb, e tempdb.
  • A causa del controllo del confronto a livello di DB di tempdb, è quindi il confronto predefinito per le colonne di stringa in tabelle temporanee (globali e locali), ma non variabili di tabella.
  • A causa del controllo del confronto a livello di DB di master, è quindi il confronto utilizzato per il livello di server dati a , ad esempio nomi di database (ovvero namecolonna in sys.databases), nomi di accesso, ecc.
  • Gestione dei nomi di parametri / variabili
  • Gestione dei nomi dei cursori
  • Movimentazione di GOTO etichette
  • Fascicolazione predefinita utilizzata per i database appena creati quando COLLATEmanca la clausola

Controlli a livello di database :

  • Predefinito regole di confronto utilizzato per le colonne di stringhe di nuova costituzione ( CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT, e NTEXT- ma non utilizzare TEXTo NTEXT) quando la COLLATEclausola non è presente nella definizione di colonna. Questo vale per entrambi CREATE TABLEeALTER TABLE ... ADD dichiarazioni.
  • Fascicolazione predefinita utilizzata per valori letterali di stringa (ie 'some text') e variabili di stringa (ie @StringVariable). Questo confronto viene utilizzato sempre e solo quando si confrontano stringhe e variabili con altre stringhe e variabili. Quando si confrontano stringhe / variabili con colonne, verrà utilizzato il confronto della colonna.
  • Le regole di confronto utilizzate per metadati a livello di database, come nomi di oggetti (ad es. sys.objects), Nomi di colonne (ad es. sys.columns), Nomi di indici (ad es. sys.indexes), Ecc.
  • Le regole di confronto utilizzate per oggetti a livello di database : tabelle, colonne, indici, ecc.

Anche:

  • ASCII è una codifica a 8 bit (per uso comune; tecnicamente "ASCII" è 7 bit con valori di carattere 0 - 127 e "ASCII Extended" è 8 bit con valori di carattere 0 - 255). Questo gruppo è lo stesso in tutte le culture.
  • La pagina di codice è la parte "estesa" di ASCII estesa e controlla quali caratteri vengono utilizzati per i valori 128 - 255. Questo gruppo varia tra le diverse culture.
  • Latin1fa non "ASCII" media dal ASCII standard copre solo i valori 0 - 127, e tutto le pagine di codice (che può essere rappresentato in SQL Server, e anche NVARCHAR) Mappa quegli stessi 128 valori per gli stessi personaggi.

Se "Cosa fa COLLATE SQL_Latin1_General_CP1_CI_AS?" significa "Cosa fa questa particolare raccolta?", quindi:

  • Poiché il nome inizia con SQL_, si tratta di un confronto di SQL Server, non di un confronto di Windows. Questi sono sicuramente obsoleti, anche se non ufficialmente deprecati, e sono principalmente per la compatibilità pre-SQL Server 2000. Anche se, sfortunatamente, SQL_Latin1_General_CP1_CI_ASè molto comune perché è l'impostazione predefinita quando si installa su un sistema operativo usando l'inglese americano come lingua. Queste regole di confronto dovrebbero essere evitate se possibile.

    Le regole di confronto di Windows (quelle con nomi che non iniziano con SQL_) sono più recenti, più funzionali, hanno un ordinamento coerente tra VARCHARe NVARCHARper gli stessi valori e vengono aggiornate con pesi di ordinamento aggiuntivi / corretti e mappature maiuscole / minuscole. Queste regole di confronto non presentano inoltre il potenziale problema di prestazioni delle regole di confronto di SQL Server: Impatto sugli indici durante il mixaggio dei tipi VARCHAR e NVARCHAR .

  • Latin1_General è la cultura / locale.
    • Per NCHAR, NVARCHAReNTEXT dati questo determina le regole linguistiche utilizzate per l'ordinamento e il confronto.
    • Per CHAR, VARCHAReTEXT data (colonne, valori letterali e variabili) questo determina:
      • regole linguistiche utilizzate per l'ordinamento e il confronto.
      • codepage utilizzata per codificare i caratteri. Ad esempio, le Latin1_Generalregole di confronto utilizzano la pagina di codice 1252, le Hebrewregole di confronto utilizzano la pagina di codice 1255 e così via.
  • CP{code_page} o {version}

    • Per le regole di confronto di SQL Server :CP{code_page} è la tabella codici a 8 bit che determina quali caratteri associano ai valori 128 - 255. Mentre ci sono quattro pagine codici per i set di caratteri a doppio byte (DBCS) che possono utilizzare combinazioni di 2 byte per creare più di 256 caratteri, questi non sono disponibili per le regole di confronto di SQL Server.
    • Per regole di confronto Windows : {version}sebbene non presenti in tutti i nomi delle regole di confronto, fa riferimento alla versione di SQL Server in cui è stata introdotta la modalità di confronto (per la maggior parte). Le regole di confronto di Windows senza numero di versione nel nome sono versione 80(ovvero SQL Server 2000 come versione 8.0). Non tutte le versioni di SQL Server vengono fornite con nuove regole di confronto, pertanto vi sono lacune nei numeri di versione. Ce ne sono alcuni che sono 90(per SQL Server 2005, che è la versione 9.0), la maggior parte lo sono 100(per SQL Server 2008, versione 10.0) e un piccolo set ha140 (per SQL Server 2017, versione 14.0).

      Ho detto "per la maggior parte" perché le regole di confronto che sono terminate _SCsono state introdotte in SQL Server 2012 (versione 11.0), ma i dati sottostanti non erano nuovi, hanno semplicemente aggiunto il supporto per i caratteri supplementari per le funzioni integrate. Pertanto, tali finali esistono per versione 90e 100regole di confronto, ma a partire solo da SQL Server 2012.

  • Successivamente hai le sensibilità, che possono essere in qualsiasi combinazione delle seguenti, ma sempre specificate in questo ordine:
    • CS= case sensitive o CI= case sensitive
    • AS= sensibile AIall'accento o = sensibile all'accento
    • KS = Kana sensibile al tipo o mancante = Kana sensibile al tipo
    • WS = sensibile alla larghezza o mancante = insensibile alla larghezza
    • VSS = selettore di variazione sensibile (disponibile solo nella versione 140 regole di confronto) o mancante = selettore di variazione insensibile
  • Ultimo pezzo opzionale:

    • _SCalla fine significa "Supporto carattere supplementare". Il "supporto" influenza solo il modo in cui le funzioni incorporate interpretano le coppie surrogate (ovvero il modo in cui i caratteri supplementari sono codificati in UTF-16). Senza _SCalla fine (o _140_nel mezzo), le funzioni integrate non vedono un singolo carattere supplementare, ma vedono invece due punti di codice insignificanti che compongono la coppia surrogata. Questa desinenza può essere aggiunta a qualsiasi confronto non binario, versione 90 o 100.
    • _BINo _BIN2alla fine significa ordinamento e confronto "binari". I dati vengono comunque archiviati allo stesso modo, ma non esistono regole linguistiche. Questo finale non è mai combinato con nessuna delle 5 sensibilità o _SC. _BINè lo stile più vecchio ed _BIN2è lo stile più recente e più accurato. Se si utilizza SQL Server 2005 o versioni successive, utilizzare _BIN2. Per i dettagli sulle differenze tra _BINe _BIN2, vedere: Differenze tra le varie regole di confronto binarie (Culture, Versioni e BIN vs BIN2) .
    • _UTF8è una nuova opzione a partire da SQL Server 2019. È una codifica a 8 bit che consente di archiviare i dati Unicode VARCHARe i CHARtipi di dati (ma non il TEXTtipo di dati obsoleto ). Questa opzione può essere utilizzata solo su regole di confronto che supportano caratteri supplementari (ovvero versioni 90 o 100 con _SCnome nel nome e versioni 140). C'è anche una singola _UTF8fascicolazione binaria ( _BIN2, non _BIN).

      NOTA: UTF-8 è stato progettato / creato per la compatibilità con ambienti / codice impostati per codifiche a 8 bit ma che desiderano supportare Unicode. Anche se ci sono alcuni scenari in cui UTF-8 può offrire fino al 50% di spazio risparmiato rispetto alle regole di confronto. Questo è lo stato naturale per chiunque lo usi per compatibilità, ma non per coloro che sperano di usarlo per risparmiare spazio. Prestare attenzione quando si mescolano i dati VARCHAR utilizzando una fascicolazione con entrambi i dati utilizzando non- fascicolazioni o dati, poiché potrebbero verificarsi comportamenti / perdite di dati strani. Per ulteriori dettagli sulle nuove regole di confronto UTF-8, consultare: Supporto UTF-8 nativo in SQL Server 2019: Salvatore o Falso profeta?NVARCHAR quello, questo è un effetto collaterale e ha un costo di un leggero impatto sulle prestazioni in molte / la maggior parte delle operazioni. Se ne hai bisogno per compatibilità, il costo è accettabile. Se lo desideri per risparmiare spazio, devi fare un test migliore e TEST ANCORA. Il test include tutte le funzionalità e non solo poche righe di dati. Tieni presente che le regole di confronto UTF-8 funzionano meglio quando TUTTE le colonne e il database stesso utilizzano VARCHARdati (colonne, variabili, valori letterali di stringhe) con un_UTF8_UTF8VARCHAR_UTF8NVARCHAR


5
Mentre ho votato a favore per contenere così tante informazioni e sforzi, la mia risposta non è assolutamente sbagliata (i database archiviano i dati, i server di database agiscono su questi dati, l'ordinamento sta agendo). Ho scelto la brevità sulla completa precisione matematica perché l'OP probabilmente cercava informazioni sufficienti, non tutte possibili.
Kris,

4
Ciao @Kris. Grazie. Per essere onesti, non ho detto che la tua risposta era completamente sbagliata, semplicemente tristemente incompleta. Ho aggiornato per chiarire, si spera. Ho capito cosa stai dicendo, ma l'OP ha chiesto che cosa fa la COLLATEclausola CREATE DATABASE. Hai detto una delle tante cose che fa. Perché pensi che l'OP voglia conoscere solo il 10% della risposta? Se vengono presentate tutte le informazioni, ogni persona può decidere quanto impiegare. Ma se vengono fornite solo alcune informazioni, la scelta è stata fatta per loro. Ho scelto di fornire quante più informazioni possibili perché la maggior parte di esse non è ben nota. (continua)
Solomon Rutzky,

5
Penso di vedere cosa intendi, ma ho l'obiettivo di fornire informazioni sufficienti piuttosto che troppe. troppe informazioni diventano rapidamente troppo complicate per molte persone. e quando non riuscirò a fornire informazioni sufficienti per qualsiasi circostanza, mi aspetterò domande di follow-up. (Non mi aspettavo nemmeno tanta attenzione all'argomento)
Kris,

8
@Kris Per un po 'ho avuto il significato di dire "Grazie!" per mostrare tale maturità e professionalità. Sono un po 'abituato alle persone che si offendono personalmente per qualcuno che dice che hanno torto e che poi diventano "difficili" (o anche più difficili) con cui interagire. Ma la tua risposta misurata alla mia "la risposta accettata è SBAGLIATA " mi ha ispirato a attenuare la mia introduzione e dovrebbe servire come esempio per gli altri qui su come comunicare in modo corretto e produttivo 😺.
Solomon Rutzky,

4
Sei il benvenuto e mi fa piacere sapere che in qualche modo ho avuto un impatto positivo, ma mi piace essere "sbagliato", apre opportunità per imparare cose nuove, il che è fantastico!
Kris

24

CP1 significa "Pagina codice 1" - tecnicamente questo si traduce in pagina codice 1252


16

La parola chiave COLLATE specifica quale tipo di set di caratteri e regole (ordine, regole di confronto) si sta utilizzando per i valori di stringa.

Ad esempio, nel tuo caso stai usando regole latine con maiuscole / minuscole ( CI ) e accento sensibile ( AS )

È possibile fare riferimento a questa documentazione


9

Questo specifica le regole di confronto predefinite per il database. Ogni campo di testo creato nelle tabelle nel database utilizzerà tale confronto, a meno che non ne specifichi uno diverso.

Un database ha sempre regole di confronto predefinite. Se non ne specifichi alcuno, viene utilizzato il confronto predefinito dell'istanza di SQL Server.

Il nome della collazione che si utilizza mostra che utilizza la pagina di codice 1 Latin1, è case sensitive (CI) e accento sensibile (AS). Questa raccolta viene utilizzata negli Stati Uniti, pertanto conterrà le regole di ordinamento utilizzate negli Stati Uniti.

Le regole di confronto decidono come confrontare i valori di testo per uguaglianza e somiglianza e come vengono confrontati durante l'ordinamento. La tabella codici viene utilizzata quando si memorizzano dati non Unicode, ad es. Campi varchar.


sbagliato (non è possibile notspecificare un confronto, anche se è possibile accettare il valore predefinito) sbagliato (viene utilizzato anche per i dati unicode)
RichardTheKiwi

@Richard aka cyberkiwi: controllare la documentazione: msdn.microsoft.com/en-us/library/ms176061.aspx La specifica della collazione è facoltativa. La tabella codici non viene utilizzata per l'archiviazione dei dati Unicode, poiché è archiviata come punti di codice Unicode a 16 bit, non come indici della tabella di codici a 8 bit.
Guffa,

Ho letto la tua risposta sbagliata, ma è ancora sbagliata. Un database ha sempre regole di confronto predefinite = SERVER , non specificamente Latin1_General_CI_AS. Ora ho letto male perché mi aspettavo quasi che l'affermazione riguardasse le regole di confronto SERVER che richiedono l'accettazione del valore predefinito nell'interfaccia utente. Per quanto riguarda il secondo punto, sembra implicare che le regole di confronto non vengano utilizzate per ordinare i dati unicode (anche se si passa da sortinga storingnelle ultime 2 frasi). Anche i dati di testo Unicode obbediscono alle regole di confronto.
RichardTheKiwi,

@Richard aka cyberkiwi: ho modificato il paragrafo relativo alle regole di confronto predefinite in modo che corrisponda alla documentazione specifica a cui mi sono collegato. (Differisce a seconda della versione del server.) Per quanto riguarda il secondo punto, non riesco a vedere come potrei renderlo più chiaro. Il testo dice che la tabella codici viene utilizzata quando si memorizzano dati non Unicode. Una tabella codici non viene utilizzata per determinare l'ordinamento, né per i dati unicode né per i dati non unicode.
Guffa,
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.