sql >> Database >  >> RDS >> Database

Inzicht in de sortering op databaseniveau en de impact van het wijzigen ervan voor een database

Wanneer u een applicatie ontwikkelt of een code schrijft in het SQL-databasesysteem, is het cruciaal om te begrijpen hoe gegevens worden gesorteerd en vergeleken. U kunt uw gegevens in een specifieke taal opslaan, of u wilt dat SQL Server hoofdlettergevoelige en hoofdletterongevoelige gegevens afzonderlijk behandelt. Microsoft heeft een SQL Server-instelling gegeven met de naam Collatie om dergelijke vereisten te controleren en aan te pakken.

Wat is sorteren in SQL Server?

We kunnen de sortering op verschillende niveaus in SQL Server instellen, zoals hieronder aangegeven.

  • Serverniveau
  • Databaseniveau
  • Kolomniveau
  • Uitdrukkingsniveau

De sortering op serverniveau kan soms SQL Server-instantieniveau-sortering worden genoemd .

De sortering op databaseniveau wordt overgenomen van de sorteerinstelling op serverniveau als u geen specifieke sortering kiest tijdens het maken van de database. U kunt de sortering op databaseniveau ook later wijzigen. Houd er rekening mee dat het wijzigen van de databasesortering alleen wordt toegepast op toekomstige of nieuwe objecten die na de sortering worden gemaakt.

Nieuwe sortering zal geen bestaande gegevens wijzigen die zijn opgeslagen in tabellen die zijn gesorteerd met het laatste sorteertype. Het applicatieteam heeft verdere planning nodig om deze opgeslagen gegevensconversie af te handelen vanwege de nieuwe sorteerinstelling.

Er zijn verschillende manieren om het te doen. Een daarvan is om de gegevens van de bestaande tabel te kopiëren naar een nieuwe tabel die is gemaakt met de nieuwe sortering en vervolgens de oude tabel te vervangen door de nieuwe. U kunt uw tabelgegevens ook naar een nieuwe database verplaatsen door een nieuwe sortering te gebruiken en de oude database door de nieuwe te vervangen.

OPMERKING :Het wijzigen van sortering is een complexe taak en u moet dit vermijden, tenzij u een verplichte businesscase heeft.

Hoe databasesortering in SQL Server te vinden en te wijzigen?

Laten we doorgaan en de sortering van de SQL Server-instantie en alle databases die op die instantie worden gehost, controleren. U kunt de sortering controleren door de eigenschappen op het database- of instantieniveau te openen venster met behulp van SQL Server Management Studio of door simpelweg de onderstaande T-SQL-instructie uit te voeren. De sortering voor elke database wordt opgeslagen in het systeemobject sys.databases - we zullen het openen om deze informatie te krijgen.

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

Ik heb de bovenstaande T-SQL-instructie uitgevoerd en de onderstaande uitvoer gekregen. We kunnen zien dat alle databases en sortering op serverniveau dezelfde instellingen hebben als SQL_Latin1_General_CP1_CI_AS . Dit betekent dat databasesorteringen zijn overgenomen door de sortering op serverniveau tijdens het maken ervan, en dat de standaardwaarde niet is gewijzigd.

Laat me u nu laten zien hoe u de database-sortering kunt controleren met behulp van de GUI in SQL Server Management Studio.

Maak eerst verbinding met uw SQL Server-instantie met behulp van SQL Server Management Studio. Vouw het instantieknooppunt uit gevolgd door de Databases map. Klik met de rechtermuisknop op de doeldatabase en kies Eigenschappen :

U krijgt de onderstaande Database-eigenschappen venster.

Klik nu op de Opties tabblad in het linkerdeelvenster. U krijgt meerdere eigenschappeninstellingen in het rechterdeelvenster. Collatie is de eerste eigenschap van deze pagina - je kunt zien dat het hetzelfde is als in het bovenstaande T-SQL-script.

Op dezelfde manier kunt u op het SQL Server-instantieknooppunt klikken en met de rechtermuisknop op de eigenschappen op instantieniveau klikken om de sortering op serverniveau te zien.

Als u deze sortering wilt wijzigen in een nieuwe sortering, hoeft u alleen maar op de Collatie te klikken vervolgkeuzelijst en kies de gewenste optie. Zorg ervoor dat u een volledige back-up van uw database hebt gemaakt voordat u dit doet.

Ik heb een vergelijkbare sortering gekozen met hoofdlettergevoelig SQL_Latin1_General_CP1_CS _AS voor deze database en klikte op OK om het toe te passen. Opmerking:zorg ervoor dat tijdens deze procedure niemand is verbonden met de doeldatabase, anders moet u de modus omschakelen naar één gebruiker en verander deze configuratie.

U kunt deze databasesortering ook wijzigen met behulp van de T-SQL-instructie. Gebruik daarvoor de COLLATE clausule van de ALTER DATABASE-instructie.

Eerst hebben we de database omgeschakeld naar de single-user modus, wijzigde vervolgens de sortering en, ten slotte, verplaatste de database naar de multi-user modus.

--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

Alle ondersteunde sorteringen in SQL Server weergeven

In deze sectie wordt uitgelegd hoe u alle beschikbare sorteringen in SQL Server kunt vinden. Laat me u eerst laten zien hoe u de lijst met alle ondersteunde sorteringen voor de SQL Server-instantie kunt krijgen.

SQL Server heeft een systeemfunctie genaamd fn_helpcollations() die u kunt gebruiken om alle sorteringen op te halen.

Voer de onderstaande opdracht uit om de lijst weer te geven.

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

We kunnen alle 5508 ondersteunde sorteringen zien in het uitvoergedeelte. Als u niet zeker weet welke sortering u moet kiezen, kunt u de WHERE-component in het onderstaande script gebruiken om alle mogelijke sorteringen uit te filteren die in de database kunnen worden ingesteld.

Stel dat u uw gegevens in de Amerikaans-Engelse taal moet opslaan en dat u wilt dat de SQL Server deze in een hoofdlettergevoelig formaat afhandelt. U kunt de onderstaande opdracht gebruiken om de lijst met mogelijke en ondersteunde sorteringen voor uw vraag op te halen:

--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%’

De uitvoer toont slechts 10 sorteringen die aan uw zoekopdracht voldoen. U kunt het bovenstaande script gebruiken om verschillende sorteringen uit te filteren.

Invloed van veranderende databasesortering op query-uitvoer

In deze sectie laat ik u het verschil zien tussen de twee uitvoer van dezelfde query wanneer ze worden uitgevoerd met verschillende sorteringen.

Eerst zal ik een database maken met de naam MSSQL met een sortering (SQL_Latin1_General_CP1_CS _AS ). Vervolgens zal ik dezelfde query twee keer uitvoeren om de uitvoer te krijgen. Later zal ik de sortering wijzigen in SQL_Latin1_General_CP1_CI _AS en voer opnieuw dezelfde query's uit om hun uitvoer te krijgen. U kunt beide outputs vergelijken en inzicht krijgen in de impact van het wijzigen van een databasesortering. Laten we dus beginnen met het maken van een database.

Start het nieuwe venster voor het maken van een database zoals weergegeven in de onderstaande afbeelding. U kunt deze database ook maken met T-SQL. Daarna kunt u de databasenaam en de bijbehorende gegevensbestanden zien. Klik nu op het tweede tabblad in het linkerdeelvenster om naar het sorteereigenschappenvenster te gaan.

U kunt zien dat de sorteernaam voor deze database de standaard is . Dit betekent dat deze database de sortering overneemt van het sorteertype op serverniveau. Klik op de Collatie vervolgkeuzelijst om uw nieuwe sortering te kiezen.

Ik heb de onderstaande sortering SQL_Latin1_General_CP1_CS geselecteerd _AS voor deze database – niet de standaard. Klik op OK om door te gaan met het maken van de database.

Controleer nu de databasesortering voor een nieuw gemaakte database. We kunnen zien dat het SQL_Latin1_General_CP1_CS is _AS zoals we in de vorige stap hebben geselecteerd.

In SQL_Latin1_General_CP1_CS _AS , CS staat voor hoofdlettergevoelig modus, en CI staat voor hoofdlettergevoelig modus. Nu kunt u de onderstaande T-SQL-code of een andere code uitvoeren om de uitvoer te krijgen.

Ik heb dezelfde opdracht twee keer uitgevoerd. Het eerste script filtert de kolomnamen met een waarde SYS in hoofdletter letters, terwijl het tweede script dezelfde kolom filtert met dezelfde waarde sys in klein brieven. De uitvoersectie laat zien dat het eerste script geen uitvoer heeft getoond, terwijl het tweede script de uitvoer heeft weergegeven vanwege het hoofdlettergevoelige gedrag.

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

Nu zullen we de sortering van deze database wijzigen in de hoofdletterongevoelige sortering SQL_Latin1_General_CP1_CI _AS door de onderstaande T-SQL-instructies uit te voeren. U kunt het ook wijzigen via de GUI door het venster Database-eigenschappen in SQL Server Management Studio te openen.

--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

Ik heb het bovenstaande script in één keer uitgevoerd en de databasesortering is met succes gewijzigd in een nieuwe sortering met hoofdletterongevoelige ondersteuning.

U kunt deze wijziging verifiëren door de onderstaande scripts uit te voeren om de sortering van de nieuw gemaakte database MSSQL te controleren. We kunnen zien dat de nieuwe sortering is ingesteld voor deze database in de onderstaande afbeelding.

We zullen opnieuw dezelfde T-SQL-instructie uitvoeren voordat we de sortering wijzigen om de impact van deze wijziging te zien. Zoals we nu kunnen zien, zijn beide T-SQL-statements in de uitvoer.

Conclusie

Ik hoop dat het duidelijk is dat de sortering in SQL Server cruciaal is. We hebben gedefinieerd welke impact het heeft als u wijzigingen aanbrengt in de sortering op elk niveau in SQL Server. Maak altijd een goede planning en test eerst de wijzigingen in uw lagere levenscyclusomgeving.

Blijf op de hoogte voor mijn volgende artikel, waar ik je een stapsgewijze methode laat zien om de sortering op serverniveau te wijzigen.

Deel dit artikel en geef uw feedback, het helpt ons te verbeteren.


  1. Bereken het tijdsverschil tussen twee rijen

  2. Ruby on Rails 3 Kan geen verbinding maken met lokale MySQL-server via socket '/tmp/mysql.sock' op OSX

  3. Sql Server-trigger voegt waarden van nieuwe rij in een andere tabel in

  4. hoe ISO-8601 Gregoriaanse datumtabel te maken in postgres