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:
latin1
fa in modo che il server tratti le stringhe usando charset latin 1, in pratica ascii CP1
acronimo di Code Page 1252 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) :
master
, model
, msdb
e tempdb
. tempdb
, è quindi la Collation predefinita per le colonne di stringa nelle tabelle temporanee (globali e locali), ma non le variabili di tabella. 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. GOTO
COLLATE
Controlli a livello di database :
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
. '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. sys.objects
), nomi di colonne (ad es. sys.columns
), nomi di indici (ad esempio sys.indexes
), ecc. Anche:
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). Latin1
fa riferimento alla cultura / locale che determina:
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. 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.