Delen via


De kolomcollatie instellen of wijzigen

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

U kunt de databasesortering voor teken, varchar, tekst, nchar, nvarcharen ntext gegevens overschrijven door een andere sortering op te geven voor een specifieke kolom van een tabel en een van de volgende opties te gebruiken:

  • De COLLATE-clausule in CREATE TABLE en ALTER TABLE, zoals te zien in de onderstaande voorbeelden.

    • Conversie ter plaatse. Overweeg een van de bestaande tabellen die hieronder zijn gedefinieerd:

      -- 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);
      

      Als u de kolom in-place wilt converteren om UTF-8 te gebruiken, voert u een ALTER COLUMN-instructie uit waarmee het vereiste gegevenstype en een UTF-8-sortering worden ingesteld:

      ALTER TABLE dbo.MyTable 
      ALTER COLUMN CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8
      

      Deze methode is eenvoudig te implementeren, maar het is een mogelijk blokkerende bewerking die een probleem kan worden voor grote tabellen en drukke toepassingen.

    • KopiĆ«ren en vervangen. Overweeg een van de bestaande tabellen die hieronder zijn gedefinieerd:

      -- 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
      

      Als u de kolom wilt converteren om UTF-8 te gebruiken, kopieert u de gegevens naar een nieuwe tabel waarin de doelkolom al het vereiste gegevenstype en een UTF-8-sortering is ingeschakeld en vervangt u de oude tabel:

      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
      

      Deze methode is veel sneller dan in-place conversie, maar het verwerken van complexe schema's met veel afhankelijkheden (FK's, PK's, Triggers, DB's) en het synchroniseren van de staart van de tabel (als de database in gebruik is) vereist meer planning.

    Zie Sortering en Unicode-ondersteuningvoor meer informatie.

  • SQL Server Management Studio. Zie voor meer informatie Kolommen (databasemotor) wijzigen.

  • Gebruik de eigenschap Column.Collation in SMO (SQL Server Management Objects).

U kunt de sortering van een kolom waarnaar momenteel wordt verwezen, niet wijzigen door een van de volgende opties:

  • Een berekende kolom
  • Een index
  • Distributiestatistieken, die automatisch gegenereerd zijn of door de CREATE STATISTICS-instructie gegenereerd worden.
  • Een CHECK-constraint
  • Een FOREIGN KEY-beperking

Wanneer u met tempdb-werkt, bevat de component COLLATE een database_default optie om op te geven dat een kolom in een tijdelijke tabel gebruikmaakt van de standaardsortering van de huidige gebruikersdatabase voor de verbinding in plaats van de sortering van tempdb-.

Collaties en tekstkolommen

U kunt waarden invoegen of bijwerken in een tekst kolom waarvan de sortering verschilt van de codepagina van de standaardsortering van de database. SQL Server converteert de waarden impliciet naar de collation van de kolom.

Sorteringen en tempdb

De tempdb--database wordt gebouwd telkens wanneer SQL Server wordt gestart en heeft dezelfde standaardsortering als het model database. Dit is meestal hetzelfde als de standaardinstelling van de instantie. Als u een gebruikersdatabase maakt en een andere standaardsortering opgeeft dan model, heeft de gebruikersdatabase een andere standaardsortering dan tempdb-. Alle tijdelijke opgeslagen procedures of tijdelijke tabellen worden gemaakt en opgeslagen in tempdb-. Dit betekent dat alle impliciete kolommen in tijdelijke tabellen en alle coercible-standaardconstanten, variabelen en parameters in tijdelijke opgeslagen procedures sorteringen hebben die verschillen van vergelijkbare objecten die zijn gemaakt in permanente tabellen en opgeslagen procedures.

Dit kan leiden tot problemen met een niet-overeenkomende sortering tussen door de gebruiker gedefinieerde databases en systeemdatabaseobjecten. Een exemplaar van SQL Server maakt bijvoorbeeld gebruik van de Latin1_General_CS_AS sortering en u voert de volgende instructies uit:

CREATE DATABASE TestDB COLLATE Estonian_CS_AS;  
USE TestDB;  
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  

In dit systeem maakt de tempdb--database gebruik van de Latin1_General_CS_AS sortering met codepagina 1252 en TestDB en TestPermTab.Col1 de Estonian_CS_AS sortering gebruiken met codepagina 1257. Bijvoorbeeld:

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  

In het vorige voorbeeld gebruikt de tempdb-database de Latin1_General_CS_AS sortering en TestDB en TestTab.Col1 de Estonian_CS_AS-sortering. Bijvoorbeeld:

SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;  

Omdat tempdb- gebruikmaakt van de standaardsortering van de server en TestPermTab.Col1 een andere sortering gebruikt, retourneert SQL Server deze fout: 'Kan sorteringsconflict tussen 'Latin1_General_CI_AS_KS_WS' en 'Estonian_CS_AS' in gelijkheidsbewerking niet oplossen.'

U kunt een van de volgende alternatieven gebruiken om de fout te voorkomen:

  • Geef op dat de tijdelijke tabelkolom de standaardsortering van de gebruikersdatabase gebruikt, niet tempdb-. Hierdoor kan de tijdelijke tabel werken met op vergelijkbare wijze opgemaakte tabellen in meerdere databases, als dat van uw systeem vereist is.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • Geef de juiste sortering op voor de #TestTempTab kolom:

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE Estonian_CS_AS  
       );  
    

Zie ook

Instellen of wijzigen van de servercollatie
De databasesortering instellen of wijzigen
Sorteervolgorde en Unicode-ondersteuning