Sdílet prostřednictvím


Nastavení nebo změna kolace sloupců

platí pro:SQL ServerAzure SQL Databaseazure 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