Nastavení nebo změna kolace sloupců
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
Můžete přepsat kolaci databáze pro znak, varchar, text, nchar, nvarchara ntext dat tím, že specifikujete jinou kolaci pro konkrétní sloupec tabulky a použijete jeden z následujících způsobů:
Klauzule COLLATE CREATE TABLE a ALTER TABLE, jak je vidět v následujících příkladech.
Místní převod. Představte si jednu z existujících tabulek definovaných níže:
-- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC); -- VARCHAR column is encoded the Latin code page and therefore is not Unicode capable CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
Pokud chcete převést sloupec na místní použití UTF-8, spusťte příkaz
ALTER COLUMN
, který nastaví požadovaný datový typ a kolaci s podporou UTF-8:ALTER TABLE dbo.MyTable ALTER COLUMN CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8
Tato metoda se snadno implementuje, jedná se ale o pravděpodobně blokující operaci, která může být problémem pro velké tabulky a zaneprázdněné aplikace.
Zkopírujte a nahraďte. Představte si jednu z existujících tabulek definovaných níže:
-- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC); GO -- VARCHAR column is encoded using the Latin code page and therefore is not Unicode capable CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI); GO
Pokud chcete převést sloupec tak, aby používal UTF-8, zkopírujte data do nové tabulky, kde je cílový sloupec již ve správném datovém typu a má povolenou kolaci UTF-8, a potom nahraďte starou tabulku.
CREATE TABLE dbo.MyTableNew (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8); GO INSERT INTO dbo.MyTableNew SELECT * FROM dbo.MyTable; GO DROP TABLE dbo.MyTable; GO EXEC sp_rename 'dbo.MyTableNew', 'dbo.MyTable'; GO
Tato metoda je mnohem rychlejší než místní převod, ale zpracování složitých schémat s mnoha závislostmi (FK, PK, triggery, DF) a synchronizace konce tabulky, pokud je databáze používána, vyžaduje větší plánování.
Další informace naleznete v tématu Kolace a Podpora kódování Unicode.
SQL Server Management Studio. Další informace naleznete v tématu Úpravy sloupců (databázový stroj).
Použití vlastnosti Column.Collation v objektech SMO (SQL Server Management Objects).
Není možné změnit kolaci sloupce, který je aktuálně odkazován některým z následujících prvků:
- Vypočítaný sloupec
- Jedna z verzí indexu
- Statistika distribuce, buď automaticky vygenerovaná, nebo příkazem
CREATE STATISTICS
- Omezení CHECK
- Omezení CIZÍHO KLÍČE
Při práci s tempdbobsahuje klauzule COLLATE možnost database_default pro určení, že sloupec v dočasné tabulce používá výchozí kolaci aktuální uživatelské databáze pro připojení místo kolace tempdb.
Kolace a textové sloupce
Hodnoty můžete vložit nebo aktualizovat do textového sloupce, jehož kolace se liší od znakové stránky výchozí kolace databáze. SQL Server implicitně převede hodnoty na kolaci sloupce.
Kolace a databáze tempdb
Databáze tempdb je vytvořena při každém spuštění SQL Serveru a má stejnou výchozí kolaci jako modelová databáze . Obvykle je to stejné jako výchozí kolace instance. Pokud vytvoříte uživatelskou databázi a zadáte jinou výchozí kolaci než modelu, uživatelská databáze má jinou výchozí kolaci než databáze tempdb. Všechny dočasné uložené procedury nebo dočasné tabulky jsou vytvořeny a uloženy v databázi tempdb. To znamená, že všechny implicitní sloupce v dočasných tabulkách a všechny implicitní výchozí konstanty, proměnné a parametry v dočasných uložených procedurách mají kolace, které se liší od srovnatelných objektů vytvořených v trvalých tabulkách a uložených procedurách.
To může vést k problémům s neshodou kolací mezi uživatelsky definovanými databázemi a systémovými databázovými objekty. Například instance SQL Serveru používá kolaci Latin1_General_CS_AS a vy provedete následující příkazy:
CREATE DATABASE TestDB COLLATE Estonian_CS_AS;
USE TestDB;
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );
V tomto systému databáze tempdb používá kolaci Latin1_General_CS_AS se znakovou stránkou 1252 a TestDB
a TestPermTab.Col1
používají kolaci Estonian_CS_AS
se znakovou stránkou 1257. Například:
USE TestDB;
GO
-- Create a temporary table with the same column declarations
-- as TestPermTab
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );
INSERT INTO #TestTempTab
SELECT * FROM TestPermTab;
GO
V předchozím příkladu používá databáze tempdb kolaci Latin1_General_CS_AS a TestDB
a TestTab.Col1
používají kolaci Estonian_CS_AS
. Například:
SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;
Vzhledem k tomu, že databáze temp db používá výchozí kolaci serveru a TestPermTab.Col1
používá jinou kolaci, sql Server vrátí tuto chybu: "Nelze vyřešit konflikt kolace mezi Latin1_General_CI_AS_KS_WS a Estonian_CS_AS" rovnou operaci."
Pokud chcete této chybě zabránit, můžete použít jednu z následujících alternativ:
Určete, že dočasný sloupec tabulky používá výchozí kolaci uživatelské databáze, nikoli databáze tempdb. To umožňuje dočasné tabulce pracovat s podobnými formátovanými tabulkami ve více databázích, pokud to vyžaduje váš systém.
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar COLLATE database_default );
Zadejte správnou kolaci pro sloupec
#TestTempTab
:CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar COLLATE Estonian_CS_AS );
Viz také
Nastavení nebo změna kolace serveru
Kolace databáze – nastavení nebo změna
podpora kolace a kódování Unicode