Database
 sql >> Database >  >> RDS >> Database

Comprendere le regole di confronto a livello di database e l'impatto della modifica per un database

Quando si sviluppa un'applicazione o si scrive un codice nel sistema di database SQL, è fondamentale capire come verranno ordinati e confrontati i dati. È possibile archiviare i dati in una lingua specifica oppure è possibile che SQL Server tratti i dati con distinzione tra maiuscole e minuscole e senza distinzione tra maiuscole e minuscole. Microsoft ha fornito un'impostazione di SQL Server denominata Fascicolazione per controllare e soddisfare tali requisiti.

Che cos'è il confronto in SQL Server?

Possiamo impostare le regole di confronto a vari livelli in SQL Server come indicato di seguito.

  • Livello server
  • Livello database
  • Livello colonna
  • Livello di espressione

Le regole di confronto a livello di server a volte possono essere chiamate Confrontazioni a livello di istanza di SQL Server .

Le regole di confronto a livello di database verranno ereditate dall'impostazione delle regole di confronto a livello di server se non si scelgono regole di confronto specifiche durante la creazione del database. È anche possibile modificare le regole di confronto a livello di database in un secondo momento. Tieni presente che la modifica delle regole di confronto del database verrà applicata solo agli oggetti imminenti o nuovi che verranno creati dopo la modifica delle regole di confronto.

Le nuove regole di confronto non modificheranno i dati esistenti archiviati nelle tabelle ordinate con l'ultimo tipo di confronto. Il team dell'applicazione ha bisogno di un'ulteriore pianificazione per gestire questa conversione dei dati archiviati a causa della nuova impostazione di confronto.

Ci sono molti modi per farlo. Uno consiste nel copiare i dati dalla tabella esistente in una nuova tabella creata con le nuove regole di confronto e quindi sostituire la vecchia tabella con quella nuova. Puoi anche spostare i dati della tua tabella in un nuovo database disponendo di nuove regole di confronto e sostituire il vecchio database con quello nuovo.

NOTA :la modifica delle regole di confronto è un'attività complessa e dovresti evitarla a meno che tu non abbia un business case obbligatorio.

Come trovare e modificare le regole di confronto del database in SQL Server?

Andiamo avanti e controlliamo le regole di confronto dell'istanza di SQL Server e di tutti i database ospitati in tale istanza. Puoi controllare le regole di confronto accedendo alle proprietà a livello di istanza o database finestra utilizzando SQL Server Management Studio o semplicemente eseguendo l'istruzione T-SQL seguente. Le regole di confronto per ogni database sono archiviate nell'oggetto di sistema sys.databases – vi accederemo per ottenere queste informazioni.

--Check Database Collation
SELECT name, collation_name  
FROM sys.databases  
GO  
--Check Server or Instance level Collation
SELECT SERVERPROPERTY('Collation') As [Instance Level Collation]

Ho eseguito l'istruzione T-SQL sopra e ho ottenuto l'output seguente. Possiamo vedere che tutti i database e le regole di confronto a livello di server hanno le stesse impostazioni di SQL_Latin1_General_CP1_CI_AS . Significa che le regole di confronto del database sono state ereditate dalle regole di confronto a livello di server durante la creazione e il valore predefinito non è stato modificato.

Ora lascia che ti mostri come controllare le regole di confronto del database utilizzando la GUI in SQL Server Management Studio.

Innanzitutto, connettiti all'istanza di SQL Server utilizzando SQL Server Management Studio. Espandi il nodo dell'istanza seguito dai Database cartella. Fai clic con il pulsante destro del mouse sul database di destinazione e scegli Proprietà :

Otterrai le seguenti Proprietà database finestra.

Ora fai clic su Opzioni scheda dal pannello di sinistra. Otterrai più impostazioni delle proprietà nel pannello di destra. Fascicolazione è la prima proprietà di questa pagina:puoi vedere che è la stessa dello script T-SQL sopra.

Allo stesso modo, puoi fare clic sul nodo dell'istanza di SQL Server e fare clic con il pulsante destro del mouse sulle proprietà a livello di istanza per vedere le regole di confronto a livello di server.

Se desideri modificare queste regole di confronto con una nuova, devi solo fare clic su Fascicolazione menu a discesa e scegli l'opzione che ti serve. Assicurati di aver eseguito un backup completo del tuo database prima di farlo.

Ho scelto una confronto simile con SQL_Latin1_General_CP1_CS con distinzione tra maiuscole e minuscole _COME per questo database e cliccato su OK per applicarlo. Nota:assicurati che nessuno sia connesso al database di destinazione durante questa procedura, altrimenti dovrai cambiare la modalità in single user one e cambia questa configurazione.

Puoi anche modificare queste regole di confronto del database usando l'istruzione T-SQL. Per questo, usa COLLATE clausola dell'istruzione ALTER DATABASE.

Innanzitutto, abbiamo convertito il database in utente singolo modalità, quindi modificato le regole di confronto e, infine, spostato il database nella modalità multiutente modalità.

--Change Database Collation using T-SQL  
USE master;  
GO  
Alter DATABASE [AdventureWorks2019] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [AdventureWorks2019]  
COLLATE SQL_Latin1_General_CP1_CI_AS;  
GO
Alter DATABASE [AdventureWorks2019] SET MULTI_USER

Elenca tutte le regole di confronto supportate in SQL Server

Questa sezione ti mostrerà come trovare tutte le regole di confronto disponibili in SQL Server. Innanzitutto, lascia che ti mostri come ottenere l'elenco di tutte le regole di confronto supportate per l'istanza di SQL Server.

SQL Server dispone di una funzione di sistema denominata fn_helpcollations() che puoi utilizzare per recuperare tutte le regole di confronto.

Esegui il comando seguente per visualizzare l'elenco.

--Display the list of all collations  
SELECT name, description FROM fn_helpcollations()

Possiamo vedere tutte le 5508 regole di confronto supportate nella sezione di output. Se non sei sicuro di quale confronto scegliere, puoi utilizzare la clausola WHERE nello script seguente per filtrare tutte le possibili regole di confronto che possono essere impostate nel database.

Supponiamo che tu debba archiviare i tuoi dati nella lingua inglese americana e desideri che SQL Server li gestisca in un formato con distinzione tra maiuscole e minuscole. Puoi utilizzare il comando seguente per recuperare l'elenco delle regole di confronto possibili e supportate per la tua query:

--Display the list of all collations with WHERE clause 
SELECT Name, Description FROM fn_helpcollations()  
WHERE Name like 'SQL_Latin1%' AND Description LIKE '%case-sensitive%’

L'output mostra solo 10 regole di confronto che soddisfano la tua query. Puoi utilizzare lo script sopra per filtrare varie regole di confronto.

Impatto della modifica delle regole di confronto del database sull'output della query

In questa sezione, ti mostrerò la differenza tra i due output della stessa query quando vengono eseguiti con regole di confronto diverse.

Per prima cosa creerò un database chiamato MSSQL con una confronto (SQL_Latin1_General_CP1_CS _COME ). Quindi eseguirò la stessa query due volte per ottenere l'output. Successivamente, modificherò le regole di confronto in SQL_Latin1_General_CP1_CI _COME e di nuovo esegui le stesse query per ottenere il loro output. È possibile confrontare entrambi gli output e comprendere l'impatto della modifica delle regole di confronto di un database. Quindi, iniziamo con la creazione del database.

Avvia la nuova finestra di creazione del database come mostrato nell'immagine sottostante. Puoi anche creare questo database usando T-SQL. Successivamente, puoi vedere il nome del database e i suoi file di dati. Ora, fai clic sulla seconda scheda nel pannello di sinistra per passare alla finestra delle proprietà di confronto.

Puoi vedere che il nome delle regole di confronto per questo database è il predefinito . Significa che questo database erediterà le regole di confronto dal tipo di confronto a livello di server. Fai clic su Fascicolazione menu a discesa per scegliere la nuova raccolta.

Ho selezionato le seguenti regole di confronto SQL_Latin1_General_CP1_CS _COME per questo database – non quello predefinito. Fare clic su OK per procedere con la creazione del database.

Ora, controlla le regole di confronto del database per un database appena creato. Possiamo vedere che è SQL_Latin1_General_CP1_CS _COME come abbiamo selezionato nel passaggio precedente.

In SQL_Latin1_General_CP1_CS _COME , CS sta per maiuscole/minuscole modalità e CI sta per senza distinzione tra maiuscole e minuscole modalità. Ora puoi eseguire il codice T-SQL riportato di seguito o qualsiasi codice per ottenere l'output.

Ho eseguito lo stesso comando due volte. Il primo script filtra i nomi delle colonne con un valore SYS in capitale lettere, mentre il secondo script filtrerà la stessa colonna con lo stesso valore sys in piccolo lettere. La sezione di output dimostra che il primo script non ha mostrato alcun output, mentre il secondo script ha visualizzato l'output a causa del suo comportamento con distinzione tra maiuscole e minuscole.

Select * from sysusers
Where name=’SYS’
Go
Select * from sysusers
Where name=’sys’
GO

Ora cambieremo le regole di confronto di questo database in collation senza distinzione tra maiuscole e minuscole SQL_Latin1_General_CP1_CI _COME eseguendo le seguenti istruzioni T-SQL. Puoi anche modificarlo tramite la GUI accedendo alla finestra Proprietà database in SQL Server Management Studio.

--Change database collation to SQL_Latin1_General_CP1_CI_AS
USE master;  
GO  
Alter DATABASE [MSSQL] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [MSSQL]  
COLLATE SQL_Latin1_General_CP1_CI_AS;  
GO
Alter DATABASE [MSSQL] SET MULTI_USER

Ho eseguito lo script precedente in un colpo solo e le regole di confronto del database sono state modificate correttamente con una nuova con supporto senza distinzione tra maiuscole e minuscole.

È possibile verificare questa modifica eseguendo gli script seguenti per verificare le regole di confronto del database MSSQL appena creato. Possiamo vedere che le nuove regole di confronto sono impostate per questo database nell'immagine sottostante.

Eseguiremo nuovamente la stessa istruzione T-SQL prima di modificare le regole di confronto per vedere l'impatto di questa modifica. Come possiamo vedere ora, entrambe le istruzioni T-SQL sono nell'output.

Conclusione

Spero sia evidente che le regole di confronto in SQL Server sono cruciali. Abbiamo definito l'impatto che lascia se si apportano modifiche alle regole di confronto a qualsiasi livello in SQL Server. Effettua sempre una pianificazione adeguata e verifica prima le modifiche nell'ambiente a ciclo di vita inferiore.

Resta sintonizzato per il mio prossimo articolo, in cui ti mostrerò un metodo passo passo per modificare le regole di confronto a livello di server.

Condividi questo articolo e dai il tuo feedback, ci aiuta a migliorare.