{coding}Sight
při vývoji aplikace nebo zápisu kódu do databázového systému SQL je zásadní pochopit, jak budou data tříděna a porovnávána. Data můžete ukládat v určitém jazyce nebo můžete chtít, aby SQL Server zacházel s daty citlivými na velká a malá písmena Samostatně. Společnost Microsoft poskytla nastavení serveru SQL s názvem Collation pro kontrolu a řešení těchto požadavků.
co je Řazení v SQL Serveru?
můžeme nastavit řazení na různých úrovních v SQL Serveru, jak je uvedeno níže.
- úroveň serveru
- úroveň databáze
- úroveň sloupce
- úroveň výrazu
řazení úrovně serveru může být někdy nazýváno porovnáním úrovně instance serveru SQL Server.
řazení úrovně databáze bude zděděno z nastavení řazení úrovně serveru, pokud během vytváření databáze nevyberete žádné konkrétní řazení. Řazení na úrovni databáze můžete také později změnit. Mějte na paměti, že změna řazení databáze bude použita pouze pro nadcházející nebo nové objekty, které budou vytvořeny po změně řazení.
nové řazení nezmění stávající data uložená v tabulkách, které byly seřazeny podle posledního typu řazení. Aplikační tým potřebuje další plánování, aby zvládl tuto konverzi uložených dat díky novému nastavení řazení.
existuje několik způsobů, jak to udělat. Jedním z nich je zkopírovat data z existující tabulky do nové tabulky vytvořené pomocí nového řazení a poté nahradit starou tabulku novou. Data tabulky můžete také přesunout do nové databáze tím, že budete mít nové řazení a starou databázi nahraďte novou.
poznámka: Změna řazení je složitý úkol a měli byste se mu vyhnout, pokud nemáte povinný obchodní případ.
jak najít a změnit řazení databáze v SQL Serveru?
pojďme do toho a zkontrolujte řazení instance serveru SQL a všech databází hostovaných v této instanci. Řazení můžete zkontrolovat přístupem do okna vlastností úrovně databáze nebo instance pomocí SQL Server Management Studio nebo jednoduše provedením níže uvedeného příkazu T-SQL. Řazení pro každou databázi je uloženo v systémovém objektu sys.databáze-dostaneme se k nim, abychom získali tyto informace.
--Check Database CollationSELECT name, collation_name FROM sys.databases GO --Check Server or Instance level CollationSELECT SERVERPROPERTY('Collation') As
provedl jsem výše uvedený příkaz T-SQL a dostal níže uvedený výstup. Vidíme, že všechny databáze a řazení na úrovni serveru mají stejné nastavení jako SQL_Latin1_General_CP1_CI_AS. To znamená, že při jejich vytváření byly posloupnosti databáze zděděny kolací na úrovni serveru a výchozí hodnota nebyla změněna.
nyní vám ukážu, jak zkontrolovat řazení databáze pomocí GUI v SQL Server Management Studio.
nejprve se připojte k instanci serveru SQL pomocí aplikace SQL Server Management Studio. Rozbalte uzel instance a poté složku databáze. Klepněte pravým tlačítkem myši na cílovou databázi a vyberte Vlastnosti:
zobrazí se níže uvedené okno vlastností databáze.
Nyní klikněte na kartu Možnosti z levého panelu. V pravém panelu získáte více nastavení vlastností. Řazení je první vlastností této stránky – můžete vidět, že je stejné jako ve výše uvedeném skriptu T-SQL.
podobně můžete kliknout na uzel instance serveru SQL Server a pravým tlačítkem myši na vlastnosti úrovně instance Zobrazit řazení na úrovni serveru.
Chcete – li změnit toto řazení na nové řazení, stačí kliknout na rozbalovací nabídku řazení a vybrat požadovanou možnost. Než to uděláte, ujistěte se, že jste provedli úplnou zálohu databáze.
pro tuto databázi jsem zvolil podobnou kombinaci s citlivými na velká a malá písmena SQL_Latin1_General_CP1_CS_AS a klepnutím na tlačítko OK ji použijete. Poznámka: Ujistěte se, že během tohoto postupu není nikdo připojen k cílové databázi, jinak budete muset přepnout režim na jeden uživatel a změnit tuto konfiguraci.
tuto databázi můžete také změnit pomocí příkazu T-SQL. K tomu použijte klauzuli řazení příkazu ALTER DATABASE.
nejprve jsme přepnuli databázi do režimu pro jednoho uživatele, poté změnili řazení a nakonec přesunuli databázi do režimu pro více uživatelů.
--Change Database Collation using T-SQL USE master; GO Alter DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE COLLATE SQL_Latin1_General_CP1_CI_AS; GOAlter DATABASE SET MULTI_USER
seznam všech podporovaných překladů v SQL Serveru
tato část vám ukáže, jak najít všechny dostupné řazení v SQL Serveru. Nejprve vám ukážu, jak získat seznam všech podporovaných překladů pro instanci serveru SQL.
SQL Server má systémovou funkci nazvanou fn_helpcollations (), kterou můžete použít k načtení všech koláží.
spusťte níže uvedený příkaz pro zobrazení seznamu.
--Display the list of all collations SELECT name, description FROM fn_helpcollations()
ve výstupní části vidíme všechny 5508 podporované kolace. Pokud si nejste jisti, kterou kolekci zvolit, můžete použít klauzuli WHERE v níže uvedeném skriptu k odfiltrování všech možných kombinací, které lze nastavit do databáze.
řekněme, že je třeba ukládat data v americkém anglickém jazyce a chcete, aby SQL Server s nimi zacházel ve formátu citlivém na velká a malá písmena. Níže uvedený příkaz můžete použít k načtení seznamu možných a podporovaných koláží pro váš dotaz:
--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%'
výstup zobrazuje pouze 10 koláží vyhovujících vašemu dotazu. Pomocí výše uvedeného skriptu můžete odfiltrovat různé kolace.
dopad změny řazení databáze na výstup dotazu
v této části vám ukážu rozdíl mezi dvěma výstupy stejného dotazu, když jsou prováděny s různými kategoriemi.
nejprve vytvořím databázi s názvem MSSQL s kolací (SQL_Latin1_General_CP1_CS_AS). Pak spustím stejný dotaz dvakrát, abych získal výstup. Později změním řazení na SQL_Latin1_General_CP1_CI_AS a znovu spustím stejné dotazy, abych získal jejich výstup. Můžete porovnat oba výstupy a pochopit dopad změny řazení databáze. Začněme tedy vytvořením databáze.
spusťte nové okno pro vytvoření databáze, jak je znázorněno na obrázku níže. Tuto databázi můžete také vytvořit pomocí T-SQL. Poté můžete vidět název databáze a její datové soubory. Nyní klikněte na druhou kartu na levém panelu a přepněte se do okna vlastností řazení.
můžete vidět, že název řazení pro tuto databázi je výchozí. To znamená, že tato databáze zdědí kolaci z typu kolace na úrovni serveru. Kliknutím na rozbalovací nabídku řazení vyberte novou kolekci.
vybral jsem níže uvedené řazení SQL_Latin1_General_CP1_CS_AS pro tuto databázi – ne výchozí. Klepnutím na tlačítko OK pokračujte ve vytváření databáze.
Nyní zkontrolujte řazení databáze pro nově vytvořenou databázi. Vidíme, že je to SQL_Latin1_General_CP1_CS_AS, jak jsme vybrali v předchozím kroku.
v SQL_Latin1_General_CP1_CS_AS CS znamená režim citlivý na velká a malá písmena a CI znamená režim necitlivý na velká a malá písmena. Nyní můžete spustit níže uvedený kód T-SQL nebo libovolný kód, abyste získali výstup.
dvakrát jsem provedl stejný příkaz. První skript filtruje názvy sloupců s hodnotou SYS velkými písmeny, zatímco druhý skript bude filtrovat stejný sloupec se stejnou hodnotou sys malými písmeny. Výstupní část ukazuje, že první skript nezobrazil žádný výstup, zatímco druhý skript zobrazil výstup kvůli jeho chování citlivému na velká a malá písmena.
Select * from sysusersWhere name='SYS'GoSelect * from sysusersWhere name='sys'GO
nyní změníme řazení této databáze na kombinaci sql_latin1_general_cp1_ci_as bez velkých písmen provedením níže uvedených příkazů T-SQL. Můžete jej také změnit pomocí GUI přístupem do okna vlastností databáze v SQL Server Management Studio.
--Change database collation to SQL_Latin1_General_CP1_CI_ASUSE master; GO Alter DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEGOALTER DATABASE COLLATE SQL_Latin1_General_CP1_CI_AS; GOAlter DATABASE SET MULTI_USER
provedl jsem výše uvedený skript v jednom záběru a kompilace databáze byla úspěšně změněna na novou kolekci s podporou necitlivých na velká a malá písmena.
tuto změnu můžete ověřit spuštěním níže uvedených skriptů a zkontrolovat řazení nově vytvořené databáze MSSQL. Vidíme, že nová kombinace je nastavena pro tuto databázi na obrázku níže.
před změnou řazení znovu spustíme stejný příkaz T-SQL, abychom viděli dopad této změny. Jak nyní vidíme, oba příkazy T-SQL jsou ve výstupu.
závěr
doufám, že je zřejmé, že řazení v SQL Serveru je zásadní. Definovali jsme, jaký dopad to zanechá, pokud provedete změny v Řazení na jakékoli úrovni v SQL Serveru. Vždy proveďte správné plánování a nejprve otestujte změny v prostředí s nižším životním cyklem.
zůstaňte naladěni na můj další článek, kde vám ukážu postupnou metodu pro změnu řazení na úrovni serveru.