Aracılığıyla paylaş


Sütun Harmanlamasını Ayarlama veya Değiştirme

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Tablonun belirli bir sütunu için farklı bir harmanlama belirterek ve aşağıdakilerden birini kullanarak, karakter, varchar, metin, nchar, nvarcharve ntext verileri için veritabanı harmanlamasını geçersiz kılabilirsiniz:

  • Aşağıdaki örneklerde gösterildiği gibi, CREATE TABLE ve ALTER TABLECOLLATE yan tümcesi.

    • Yerinde dönüştürme. Aşağıda tanımlanan mevcut tablolardan birini göz önünde bulundurun:

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

      Sütunu UTF-8 kullanacak şekilde yerinde dönüştürmek için gerekli veri türünü ve UTF-8 özellikli harmanlamayı ayarlayan bir ALTER COLUMN deyimi çalıştırın:

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

      Bu yöntemi uygulamak kolaydır, ancak büyük tablolar ve meşgul uygulamalar için sorun haline gelebilecek muhtemelen bir engelleme işlemidir.

    • Kopyalayıp değiştirin. Aşağıda tanımlanan mevcut tablolardan birini göz önünde bulundurun:

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

      Sütunu UTF-8 kullanacak şekilde dönüştürmek için, verileri hedef sütunun zaten gerekli veri türü ve UTF-8 etkin harmanlama olduğu yeni bir tabloya kopyalayın ve ardından eski tabloyu değiştirin:

      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
      

      Bu yöntem yerinde dönüştürmeden çok daha hızlıdır, ancak birçok bağımlılığı olan karmaşık şemaları işlemek (FK'ler, SDK'lar, Tetikleyiciler, DF'ler) ve tablonun kuyruğunu eşitlemek (veritabanı kullanılıyorsa) daha fazla planlama gerektirir.

    Daha fazla bilgi için bkz. Harmanlama ve Unicode Desteği.

  • SQL Server Management Studio. Daha fazla bilgi için bkz. sütunları değiştirme (Veritabanı Altyapısı) .

  • SQL Server Yönetim Nesneleri'nde (SMO) Column.Collation özelliğini kullanma.

Şu anda aşağıdakilerden herhangi biri tarafından başvurulan bir sütunun harmanlamasını değiştiremezsiniz:

  • Hesaplanan sütun
  • Dizin
  • Otomatik olarak veya CREATE STATISTICS deyimi tarafından oluşturulan dağıtım istatistikleri
  • CHECK kısıtlaması
  • YABANCı ANAHTAR kısıtlaması

tempdbile çalıştığınızda, COLLATE yan tümcesi, geçici tablodaki bir sütunun tempdbharmanlaması yerine bağlantı için geçerli kullanıcı veritabanının harmanlama varsayılanını kullanmasını belirten database_default bir seçenek içerir.

Harmanlamalar ve metin Sütunları

Veritabanının varsayılan karşılaştırma sıralamasının kod sayfasından farklı bir metin sütununa değer ekleyebilir veya güncelleştirebilirsiniz. SQL Server, değerleri örtük olarak sütunun harmanlamasına dönüştürür.

Sıralamalar ve tempdb

tempdb veritabanı, SQL Server her başlatıldığında oluşturulur ve modeli veritabanıyla aynı varsayılan harmanlama özelliğine sahiptir. Bu genellikle örneğin varsayılan sıralaması ile aynıdır. Bir kullanıcı veritabanı oluşturur ve modelindekinden farklı bir varsayılan harmanlama belirtirseniz, kullanıcı veritabanı, tempdbveritabanından farklı bir varsayılan harmanlamaya sahip olur. Tüm geçici saklı yordamlar veya geçici tablolar tempdbiçinde oluşturulur ve depolanır. Bu, geçici tablolardaki tüm örtük sütunların ve geçici saklı yordamlardaki tüm tutarlı varsayılan sabitlerin, değişkenlerin ve parametrelerin kalıcı tablolarda ve saklı yordamlarda oluşturulan karşılaştırılabilir nesnelerden farklı harmanlamalara sahip olduğu anlamına gelir.

Bu, kullanıcı tanımlı veritabanları ve sistem veritabanı nesneleri arasındaki harmanlamalarda uyuşmazlıklarla ilgili sorunlara yol açabilir. Örneğin bir SQL Server örneği Latin1_General_CS_AS harmanlamasını kullanır ve aşağıdaki deyimleri yürütür:

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

Bu sistemde, tempdb veritabanı 1252 kod sayfasıyla Latin1_General_CS_AS harmanlamasını kullanır ve TestDB ve TestPermTab.Col1 kod sayfası 1257 ile Estonian_CS_AS harmanlamasını kullanır. Örneğin:

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  

Önceki örnekte, tempdb veritabanı Latin1_General_CS_AS harmanlamayı kullanır ve TestDB ve TestTab.Col1Estonian_CS_AS harmanlamasını kullanır. Örneğin:

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

tempdb varsayılan sunucu harmanlamasını kullandığından ve TestPermTab.Col1 farklı bir harmanlama kullandığından, SQL Server şu hatayı döndürür: "'Latin1_General_CI_AS_KS_WS' ile 'Estonian_CS_AS' arasındaki harmanlama çakışması işleme eşit olarak çözümlenemiyor."

Hatayı önlemek için aşağıdaki alternatiflerden birini kullanabilirsiniz:

  • Geçici tablo sütununun tempdb değil, kullanıcı veritabanının varsayılan harmanlamasını kullandığını belirtin. Bu, geçici tablonun, sisteminiz için gerekliyse, birden çok veritabanında benzer şekilde biçimlendirilmiş tablolarla çalışmasını sağlar.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • #TestTempTab sütunu için doğru harmanlamayı belirtin:

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

Ayrıca Bkz.

Sunucu Harmanlamasını Ayarlama veya Değiştirme
Veritabanı Harmanlamasını Ayarlama veya Değiştirme
Harmanlama ve Unicode Desteği