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