V tomto článku bych se rád podělil o zkušenost se změnou znakové sady MS SQL serveru. Je několik cest, některé jsou dokumentované a podporované, jiné nikoliv.
Seznam podporovaných a výchozích znakových sad je možné najít v dokumentaci.
Změna znakové sady uživatelské databáze
V rámci instance MS SQL serveru je možné měnit collation pouze jedné databáze, nebo její části. K tomu slouží dokumentovaná a podporovaná cesta s využitím jazyka T-SQL. Ukažme si to na příkladu databáze jménem Products. Jako první bod je dobré vědět, jaká je stávající callation databáze, což nám vypíš příkaz:
SELECT name, collation_name FROM sys.databases WHERE name = 'Products'
--pro celý server můžeme použít
SELECT CONVERT(nvarchar(128), SERVERPROPERTY('collation'));
Nyní můžeme přistoupit k samotné změně na kódování Czech_CI_AS, což provedeme následujícím skriptem:
-- přepneme databázi do jednouživatelského módu
ALTER DATABASE Products SET SINGLE_USER WITH ROLLBACK IMMEDIATE
-- změníme kódování
ALTER DATABASE Products COLLATE Czech_CI_AS;
-- Vrátíme databázi do plnohodnotného režimu
ALTER DATABASE Products SET MULTI_USER
Nyní máme hotovo. Tato změna má dopad na celou jednu databázi, ostatní neovlivňuje a nastavení serveru také nemění. Bez problémů funguje na všech verzích od 2005 po 2022.
Změna collation pouze jednoho sloupce
Pokud budeme potřebovat překódovat jen jeden sloupec databáze i to je možné. Je to velmi jednoduchý jeden řádek T-SQL kódu, opět si ukážeme příklad:
ALTER TABLE ProductGuid ALTER COLUMN Description nvarchar(1000) COLLATE Czech_CI_AS
Změna znakové sady serveru
Nyní si popíšeme cestu, jak změnit znakovou sadu serveru, neovlivní nastavení uživatelských databází. Tento postup je dokumentovaný Microsoftem a podporovaný.
Přejděte do složky, kde máte nainstalovaný SQL server a v ní do složky Setup Bootstrap.V této cestě spusťte příkazovou řádku, nebo PowerShell. Např..: C:\Program Files\Microsoft SQL server\140\Setup Bootstrap
V této cestě pak spustíme následující příkaz:
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=SQL2017 /SQLSYSADMINACCOUNTS=ServerDB\wnd_rebuid /SAPWD= wnd_auth_sql2017 /SQLCOLLATION=Czech_CI_AS
V PowerShellu by to vypadalo následovně:
.\Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=SQL2017 /SQLSYSADMINACCOUNTS=ServerDB\wnd_rebuid /SAPWD= wnd_auth_sql2017 /SQLCOLLATION=Czech_CI_AS
Výše uvedený příklad je pro Windows autentizaci, pokud budeme využívat SQL autentizaci, pak zadáváme login v jednoduchém tvaru.
Po dokončení příkazu máme hotovo, doporučuji restartovat instanci. Tato cesta funguje od verze 2008 R2.
Nedokumentovaná a nepodporovaná cesta
Tato cesta změní Callation celého serveru včetně všech uživatelských databází. Je velmi důležité mát kompletní zálohu a i tak mohu tento postup schválit jen pro testování, případně vývoj, nikoliv produkci.
Opět přejdeme k složky SQL serveru, přesněji k umístění souboru sqlserver.exe, například: C:\Program Files\Microsoft SQL server\MSSQL14.SQL2017\MSSQL\Binn
V této cestě opět spustíme příkazovou řádku jako správce. Nyní zastavíme všechny služby SQL serveru přes jeho řídící konzoli. Do příkazové řádky pak zadáme např.:
sqlservr -m -T4022 -T3659 -s"SQL2017" -q"Czech_CI_AS"
Význam parametrů je následující:
- m: single user režim
- T4022: Vynechání spouštěcích procedur
- T3569: logování všech chyb při startu SQL serveru
- s: název instance, pokud je pojmenovaná, pro default název není potřeba uvádět
- q: požadovaná collation
Po dokončení procesu stiskneme CTRL + C a potvrdíme vypnutí serveru.

Nyní můžeme server pomocí management konzole spustit a máme nastavenou novou callation na všech databázích.
Postup je testován na verzi 2005 a novější.