Mengatur atau Mengubah Kolase Kolom

Berlaku untuk:Database SQL Server Azure SQL Azure SQL Managed Instance

Anda dapat mengganti kolamen database untuk data karakter, varchar, teks, nchar, nvarchar, dan ntext dengan menentukan kolamen yang berbeda untuk kolom tabel tertentu dan menggunakan salah satu hal berikut ini:

  • Klausa COLLATE dari CREATE TABLE dan ALTER TABLE, seperti yang terlihat pada contoh di bawah ini.

    • Konversi di tempat. Pertimbangkan salah satu tabel yang sudah ada yang ditentukan di bawah ini:

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

      Untuk mengonversi kolom di tempat untuk menggunakan UTF-8, jalankan ALTER COLUMN pernyataan yang mengatur jenis data yang diperlukan dan kolase yang diaktifkan UTF-8:

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

      Metode ini mudah diimplementasikan, namun ini adalah operasi pemblokiran yang mungkin menjadi masalah untuk tabel besar dan aplikasi yang sibuk.

    • Salin dan ganti. Pertimbangkan salah satu tabel yang sudah ada yang ditentukan di bawah ini:

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

      Untuk mengonversi kolom untuk menggunakan UTF-8, salin data ke tabel baru di mana kolom target sudah merupakan tipe data yang diperlukan dan kolase yang diaktifkan UTF-8, lalu ganti tabel lama:

      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
      

      Metode ini jauh lebih cepat daripada konversi di tempat, tetapi menangani skema kompleks dengan banyak dependensi (FK, PK, Pemicu, DF) dan menyinkronkan ekor tabel (jika database sedang digunakan) membutuhkan lebih banyak perencanaan.

    Untuk informasi selengkapnya, lihat Kolajeasi dan Dukungan Unicode.

  • SQL Server Management Studio. Untuk informasi selengkapnya, lihat Mengubah Kolom (Mesin Database).

  • Menggunakan properti Column.Collation di SQL Server Management Objects (SMO).

Anda tidak dapat mengubah kolape kolom yang saat ini dirujuk oleh salah satu hal berikut ini:

  • Kolom komputasi
  • Indeks
  • Statistik distribusi, baik yang dihasilkan secara otomatis atau oleh CREATE STATISTICS pernyataan
  • Batasan CHECK
  • Batasan KUNCI ASING

Saat Anda bekerja dengan tempdb, klausa COLLATE menyertakan opsi database_default untuk menentukan bahwa kolom dalam tabel sementara menggunakan default kolaksi database pengguna saat ini untuk koneksi alih-alih kolamen tempdb.

Kolab dan teks Kolom

Anda bisa menyisipkan atau memperbarui nilai dalam kolom teks yang kolasenya berbeda dari halaman kode kolase default database. SQL Server secara implisit mengonversi nilai menjadi kolase kolom.

Kolamen dan tempdb

Database tempdb dibangun setiap kali SQL Server dimulai dan memiliki kolase default yang sama dengan database model. Ini biasanya sama dengan kolase default instans. Jika Anda membuat database pengguna dan menentukan kolamen default yang berbeda dari model, database pengguna memiliki kolamen default yang berbeda dari tempdb. Semua prosedur tersimpan sementara atau tabel sementara dibuat dan disimpan dalam tempdb. Ini berarti bahwa semua kolom implisit dalam tabel sementara dan semua konstanta, variabel, dan parameter default koercible dalam prosedur tersimpan sementara memiliki kolase yang berbeda dari objek sebanding yang dibuat dalam tabel permanen dan prosedur tersimpan.

Hal ini dapat menyebabkan masalah dengan ketidakcocokan dalam kolate antara database yang ditentukan pengguna dan objek database sistem. Misalnya, instans SQL Server menggunakan kolatasi Latin1_General_CS_AS dan Anda menjalankan pernyataan berikut:

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

Dalam sistem ini, database tempdb menggunakan kolase Latin1_General_CS_AS dengan halaman kode 1252, dan TestDBTestPermTab.Col1 menggunakan Estonian_CS_AS kolase dengan halaman kode 1257. Contohnya:

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  

Dengan contoh sebelumnya, database tempdb menggunakan kolamen Latin1_General_CS_AS, dan TestDB dan TestTab.Col1 menggunakan Estonian_CS_AS kolace. Contohnya:

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

Karena tempdb menggunakan kolate server default dan TestPermTab.Col1 menggunakan kolamen yang berbeda, SQL Server mengembalikan kesalahan ini: "Tidak dapat mengatasi konflik kolaterasi antara 'Latin1_General_CI_AS_KS_WS' dan 'Estonian_CS_AS' sama dengan operasi."

Untuk mencegah kesalahan, Anda dapat menggunakan salah satu alternatif berikut:

  • Tentukan bahwa kolom tabel sementara menggunakan kolape default database pengguna, bukan tempdb. Ini memungkinkan tabel sementara untuk bekerja dengan tabel yang diformat serupa dalam beberapa database, jika diperlukan dari sistem Anda.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • Tentukan kolatasi yang #TestTempTab benar untuk kolom:

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

Lihat juga

Mengatur atau Mengubah Kolase Server
Mengatur atau Mengubah Kolase Database
Kolajeasi dan Dukungan Unicode