Cosa fa “COLLATE SQL_Latin1_General_CP1_CI_AS”?

Ho una query SQL per creare il database in SQLServer 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, sono abbastanza confuso riguardo la funzionalità di COLLATE SQL_Latin1_General_CP1_CI_AS .

Qualcuno può spiegarmi questo? Inoltre, mi piacerebbe sapere se la creazione del database in questo modo è una best practice?

    Imposta come il server del database ordina. 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, in pratica ascii
    2. CP1 acronimo di Code Page 1252
    3. Confronto insensibile tra maiuscole e minuscole, quindi “ABC” equivale 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 .

    Il CP1 significa ‘Codice Pagina 1’ – tecnicamente questo si traduce in codice pagina 1252

    Si prega di essere consapevoli del fatto 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 posti al di fuori delle query dell’utente rispetto ai dati dell’utente.

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

    Controlli di livello server (es. Istanza) :

    • Raccolta di livello di database per database di sistema: master , model , msdb e tempdb .
    • A causa del controllo della collazione a livello di DB di tempdb , è quindi la Collation predefinita per le colonne di stringa nelle tabelle temporanee (globali e locali), ma non le variabili di tabella.
    • A causa del controllo del livello di fascicolazione a livello di DB del master , è quindi il confronto utilizzato per i dati a livello di server , ad esempio i nomi di database (ad esempio la colonna name in sys.databases ), i nomi di accesso, ecc.
    • Gestione di parametri / nomi di variabili
    • Gestione dei nomi dei cursori
    • Gestione delle etichette GOTO
    • Regole di confronto predefinite utilizzate per i database appena creati quando manca la clausola COLLATE

    Controlli a livello di database :

    • Regole di confronto predefinite utilizzate per le colonne di stringhe appena create ( CHAR , VARCHAR , NCHAR , NVARCHAR , TEXT e NTEXT , ma non utilizzare TEXT o NTEXT ) quando la clausola COLLATE manca nella definizione della colonna. Questo vale sia per le istruzioni CREATE TABLE e ALTER TABLE ... ADD .
    • Collation predefinito utilizzato per stringhe letterali (ad esempio 'some text' ) e variabili stringa (cioè @StringVariable ). Questa fascicolazione viene sempre utilizzata 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 i metadati a livello di database, come nomi di oggetti (ad es. sys.objects ), nomi di colonne (ad es. sys.columns ), nomi di indici (ad esempio sys.indexes ), ecc.
    • Le regole di confronto utilizzate per gli oggetti a livello di database : tabelle, colonne, indici, ecc.

    Anche:

    • Le regole di confronto che iniziano con SQL_ sono le vecchie (e sicuramente obsolete, anche se non ufficialmente deprecate) regole di confronto specifiche per SQL Server (create prima che SQL Server possa utilizzare le regole di confronto a livello di sistema operativo).
    • Tutte le altre regole di confronto sono Windows Collations e dovrebbero essere quelle in uso.
    • ASCII è una codifica che è 8 bit (per uso comune, tecnicamente “ASCII” è 7 bit con caratteri 0 – 127 e “ASCII esteso” è 8 bit con caratteri 0 – 255)
    • Latin1 fa riferimento alla cultura / locale che determina:
      • Pagina codice per dati CHAR , VARCHAR e TEXT (colonne, valori letterali e variabili). La Code Page è la parte “estesa” di Extended ASCII e controlla quali caratteri vengono utilizzati per i valori da 128 a 255.
      • Le regole in base alle quali i personaggi sono ordinati e confrontati. Questo copre sia i dati VARCHAR e NVARCHAR (cioè Unicode).

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

    Ad esempio nel tuo caso stai usando le regole latine con maiuscole e minuscole ( CI ) e accent sensible ( AS )

    È ansible fare riferimento a questa documentazione

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

    Un database ha sempre un confronto predefinito. Se non si specifica alcun, vengono utilizzate le regole di confronto predefinite dell’istanza di SQL Server.

    Il nome delle regole di confronto utilizzate mostra che utilizza la tabella codici 1 di Latin1, che non fa distinzione tra maiuscole e minuscole (CI) e accent (AS). Questa collazione viene utilizzata negli Stati Uniti, quindi conterrà le regole di smistamento utilizzate negli Stati Uniti.

    La collazione decide come confrontare i valori del testo per l’uguaglianza e la somiglianza e come vengono confrontati durante l’ordinamento. La tabella codici viene utilizzata quando si memorizzano dati non Unicode, ad esempio campi varchar.