Bagikan melalui


Mengatur atau Mengubah Kolase Kolom

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

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

  • Klausul 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 diterapkan, namun ini adalah operasi yang mungkin memblokir 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 Dukungan Kolate dan 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 kolacek 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 kolate tempdb.

Kolas dan teks Kolom

Anda bisa menyisipkan atau memperbarui nilai dalam kolom teks yang kolasisnya berbeda dari halaman kode kolamen 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 kolatasi 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.

Ini dapat menyebabkan masalah dengan ketidakcocokan dalam kolate antara database yang ditentukan pengguna dan objek database sistem. Misalnya, instans SQL Server menggunakan kolase 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 kolamen Latin1_General_CS_AS dengan halaman kode 1252, dan TestDB TestPermTab.Col1 menggunakan Estonian_CS_AS kolamen 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 TestTab.Col1 menggunakan Estonian_CS_AS kolamen. Contohnya:

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

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

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

  • Tentukan bahwa kolom tabel sementara menggunakan kolamen default database pengguna, bukan tempdb. Ini memungkinkan tabel sementara untuk bekerja dengan tabel yang diformat serupa dalam beberapa database, jika diperlukan 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
Dukungan Kolajeasi dan Unicode