Posted in: Vývoj počítačů

Změna znakové sady MS SQL serveru

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ší.

Back to Top