Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apa gunanya COLLATIONS untuk kolom nvarchar (Unicode)?

Menyimpan dan mewakili karakter adalah satu hal, dan mengetahui cara menyortir dan membandingkannya adalah hal lain.

Data Unicode, disimpan dalam XML dan N -tipe awalan di SQL Server, dapat mewakili semua karakter dalam semua bahasa (untuk sebagian besar, dan itulah tujuannya) dengan satu set karakter. Jadi untuk NCHAR / NVARCHAR data (saya meninggalkan NTEXT karena seharusnya tidak digunakan lagi, dan XML karena tidak terpengaruh oleh Collations), Collations tidak mengubah karakter apa yang dapat disimpan. Untuk CHAR dan VARCHAR data, Collations lakukan mempengaruhi apa yang dapat disimpan karena setiap Collation menunjuk ke Halaman Kode tertentu, yang menentukan apa yang dapat disimpan dalam nilai 128 - 255.

Sekarang, sementara ada urutan pengurutan default untuk semua karakter, itu tidak mungkin bekerja di semua bahasa dan budaya. Ada banyak bahasa yang berbagi beberapa / banyak / semua karakter, tetapi memiliki aturan yang berbeda tentang cara mengurutkannya. Misalnya, huruf "C" muncul sebelum huruf "D" di sebagian besar alfabet yang menggunakan huruf tersebut. Dalam bahasa Inggris AS, kombinasi "C" dan "H" (yaitu "CH" sebagai dua huruf terpisah) secara alami akan muncul sebelum string apa pun yang dimulai dengan "D". Namun, dalam beberapa bahasa, kombinasi dua huruf "CH" adalah khusus dan diurutkan setelah "D":

IF (   N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI
   AND N'C'  COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
   AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
   ) PRINT 'Czech_CI_AI';

IF (   N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI
   AND N'C'  COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
   AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
   ) PRINT 'Czech_100_CI_AI';

IF (   N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI
   AND N'C'  COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
   AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
   ) PRINT 'Slovak_CI_AI';

IF (   N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS
   AND N'C'  COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
   AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
   ) PRINT 'Slovak_CS_AS';

IF (   N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS
   AND N'C'  COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
   AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
   ) PRINT 'Latin1_General_100_CI_AS'
ELSE PRINT 'Nope!';

Pengembalian:

Czech_CI_AI
Czech_100_CI_AI
Slovak_CI_AI
Slovak_CS_AS
Nope!

Untuk melihat contoh aturan penyortiran di berbagai budaya, silakan lihat:Bagan Penyusunan .

Juga, dalam beberapa bahasa, huruf-huruf atau kombinasi huruf-huruf tertentu disamakan dengan huruf-huruf lain dengan cara yang tidak sama dengan kebanyakan bahasa lain. Misalnya, hanya dalam bahasa Denmark "å" sama dengan "aa". Tapi, "å" tidak sama dengan hanya satu "a":

IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI =  N'å' COLLATE Danish_Greenlandic_100_CI_AI
AND N'a'  COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI
   ) PRINT 'Danish_Greenlandic_100_CI_AI';

IF (   N'aa' COLLATE Danish_Norwegian_CI_AI =  N'å' COLLATE Danish_Norwegian_CI_AI
   AND N'a'  COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI
   ) PRINT 'Danish_Norwegian_CI_AI';

IF (   N'aa' COLLATE Latin1_General_100_CI_AI =  N'å' COLLATE Latin1_General_100_CI_AI
   AND N'a'  COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI
   ) PRINT 'Latin1_General_100_CI_AI'
ELSE PRINT 'Nope!';

Pengembalian:

Danish_Greenlandic_100_CI_AI
Danish_Norwegian_CI_AI
Nope!

Ini semua sangat rumit, dan saya bahkan belum menyebutkan penanganan untuk bahasa kanan-ke-kiri (Ibrani dan Arab), Cina, Jepang, menggabungkan karakter, dll.

Jika Anda ingin wawasan mendalam tentang aturan, lihat Unicode Collation Algorithm (UCA) . Contoh di atas didasarkan pada contoh dalam dokumentasi itu, meskipun saya tidak percaya semua aturan di UCA telah diterapkan, terutama sejak susunan Windows (pengumpulan tidak dimulai dengan SQL_ ) didasarkan pada Unicode 5.0 atau 6.0, tergantung pada OS yang Anda gunakan dan versi .NET Framework yang diinstal (lihat SortVersion untuk detailnya).

Jadi itulah yang dilakukan Collations. Jika Anda ingin melihat semua Collations yang tersedia, jalankan saja yang berikut ini:

SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Replikasi SQL Server 2008 gagal dengan:proses tidak dapat menjalankan 'sp_replcmds'

  2. PHP + SQL Server - Bagaimana cara mengatur charset untuk koneksi?

  3. Apa cara terbaik untuk menampilkan gambar dari database server sql di asp.net?

  4. Pro dan Kontra menggunakan SqlCommand Siapkan di C#?

  5. Kesalahan:Tidak dapat menggunakan tampilan atau fungsi karena kesalahan pengikatan