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

Pengumpulan di SQL Server

Pengantar

Anda pasti sudah pernah mendengar istilah “Collation” di SQL Server. Collation adalah konfigurasi yang menentukan bagaimana penyortiran data karakter dilakukan. Ini adalah pengaturan penting yang memiliki dampak besar pada bagaimana mesin database SQL Server berperilaku dalam menangani data karakter. Dalam artikel ini, kami bertujuan untuk membahas susunan secara umum dan menunjukkan beberapa contoh penanganan susunan.

Di mana saya menemukan koleksi?

Anda dapat menemukan susunan SQL di tingkat server, database, dan kolom. Hal penting lainnya yang perlu diketahui adalah bahwa pengaturan collation tidak harus sama pada level server, database dan kolom. Anda juga dapat memperbarui kueri Anda untuk menggunakan susunan tertentu. Pada saat inilah Anda akan menyadari pentingnya mengonfigurasi susunan yang benar di seluruh lingkungan Anda karena ada kemungkinan besar masalah tak terduga jika susunan tidak konsisten.

Apa saja jenis koleksi yang tersedia?

Anda bisa mendapatkan daftar lengkap susunan yang tersedia dengan menanyakan fungsi sistem sys.fn_helpcollations()

select * from sys.fn_helpcollations()

Ini akan mengembalikan output berikut.

Jika Anda mencari kumpulan spesifik berdasarkan bahasa, Anda dapat memfilter namanya lebih lanjut. Misalnya, jika Anda mencari susunan yang didukung bahasa Maori, Anda dapat menggunakan kueri berikut.

select * from sys.fn_helpcollations()
    where name like '%Maori%'

Ini akan mengembalikan output berikut.

Dengan cara ini Anda dapat memeriksa susunan yang didukung untuk susunan pilihan Anda. Hanya dengan menanyakan fungsi sistem fn_helpcollations(), total 5508 baris dikembalikan yang berarti ada banyak susunan yang didukung. Perhatikan, bahwa ini mencakup sebagian besar bahasa di seluruh dunia.

Apa saja opsi berbeda yang Anda lihat pada nama susunan?

Misalnya, dalam susunan ini:Maori_100_CS_AI_KS_WS_SC_UTF8, Anda dapat melihat berbagai opsi dalam nama susunan.

CS – peka huruf besar/kecil
AI – tidak peka aksen
KS – peka terhadap tipe kana
WS – peka terhadap lebar
SC – karakter tambahan
UTF8 – Standar pengkodean
Berdasarkan jenis opsi pemeriksaan yang dipilih, mesin database SQL Server akan bekerja secara berbeda dalam menangani data karakter untuk operasi pengurutan dan pencarian. Misalnya, jika Anda menggunakan opsi peka huruf besar/kecil dalam susunan SQL, mesin database akan berperilaku berbeda untuk operasi kueri yang mencari "Adam" atau "adam". Dengan asumsi Anda memiliki tabel yang disebut "sampel" dan ada kolom nama depan dengan pengguna "adam". Kueri di bawah ini tidak akan memberikan hasil jika tidak ada baris dengan nama depan “Adam”. Ini karena opsi “CS-Case sensitive” dalam susunan.

select * from sample
    where firstname like '%Adam%'

Dengan contoh sederhana ini, Anda dapat memahami pentingnya memilih opsi susunan SQL yang benar. Pastikan Anda memahami persyaratan aplikasi sebelum memilih susunan terlebih dahulu.

Menemukan pemeriksaan pada contoh SQL Server

Anda bisa mendapatkan susunan server di SQL Server Management Studio (SSMS) dengan mengklik kanan contoh SQL, lalu mengklik opsi "Properti" dan memeriksa tab "Umum". Susunan ini dipilih secara default pada instalasi SQL Server.

Atau, Anda dapat menggunakan opsi serverproperty untuk menemukan nilai collation.

select SERVERPROPERTY('collation'),

Menemukan susunan database SQL

Di SSMS, klik kanan database SQL dan buka "Properties". Anda dapat memeriksa detail susunan di tab “Umum” seperti yang ditunjukkan di bawah ini.

Atau, Anda dapat menggunakan fungsi databasepropertyex untuk mendapatkan detail susunan database.

select DATABASEPROPERTYEX('Your DB Name','collation')

Menemukan susunan kolom dalam tabel

Di SSMS, buka tabel, lalu kolom, dan terakhir klik kanan masing-masing kolom untuk melihat "Properti". Jika kolom bertipe data karakter, Anda akan melihat detail susunannya.

Namun, pada saat yang sama, jika Anda memeriksa nilai untuk tipe data non-karakter, nilai pemeriksaan akan menjadi nol. Di bawah ini adalah screenshot kolom yang memiliki tipe data int.

Atau, Anda dapat menggunakan contoh kueri di bawah ini untuk melihat nilai susunan kolom.

select sc.name, sc.collation_name from sys.columns sc
inner join sys.tables t on sc.object_id=t.object_id
where t.name='t1' – enter your table name

Di bawah ini adalah output dari kueri tersebut.

Mencoba berbagai susunan dalam kueri SQL

Di bagian ini, kita akan melihat bagaimana urutan pengurutan terpengaruh ketika susunan yang berbeda digunakan dalam kueri. Sebuah tabel sampel dibuat dengan 2 kolom seperti yang ditunjukkan di bawah ini.

Kolom fname memiliki susunan default database miliknya. Dalam hal ini, susunannya adalah SQL_Latin1_General_CP1_CI_AS.
Untuk menyisipkan beberapa catatan dalam tabel, gunakan kueri di bawah ini. Tetapkan nilai Anda sendiri ke parameter.

insert into emp
  values (1,'mohammed')
  insert into emp 
  values (2,'moinudheen')
  insert into emp
  values (3,'Mohammed')
  insert into emp
  values (4,'Moinudheen')
  insert into emp
  values (5,'MOHAMMED')
  insert into emp
  values (6,'MOINUDHEEN')

Sekarang, kueri tabel emp dan urutkan berdasarkan kolom fname menggunakan susunan yang berbeda. Kami akan menggunakan susunan kolom default untuk menyortir serta susunan sensitif huruf lainnya – SQL_Latin1_General_CP1_CS_AS.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS 
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – this is default

Output untuk kueri ini diberikan di bawah ini. Perhatikan perbedaan susunan yang digunakan. Kami menggunakan case sensitive bukan case sensitive.

Anda juga dapat memeriksa rencana kueri untuk kedua kueri ini untuk mengetahui perbedaannya. Pada rencana kueri pertama di mana kami menggunakan susunan yang berbeda dari yang ada di kolom, Anda dapat melihat operator "Komputasi Skalar" tambahan.

Saat Anda mengarahkan mouse ke operator "Compute Scalar", Anda akan melihat detail tambahan seperti yang ditunjukkan di bawah ini. Hal ini disebabkan oleh konversi implisit yang terjadi saat kami menggunakan susunan yang berbeda dari susunan default yang digunakan di kolom.

Dengan contoh kecil ini, Anda bisa melihat jenis dampak pada kinerja kueri saat Anda menggunakan susunan secara eksplisit dalam kueri. Dalam database demo kami, kami menggunakan tabel sederhana tetapi bayangkan skenario waktu nyata di mana perubahan kecil dalam kinerja kueri dapat menyebabkan hasil yang tidak diharapkan.

Memeriksa apakah mungkin untuk mengubah susunan di tingkat instance

Di bagian ini, kami akan meninjau skenario yang berbeda di mana kami mungkin harus mengubah susunan default. Anda mungkin mengalami situasi, ketika server atau database diserahkan kepada Anda dan mereka mungkin tidak memenuhi kebijakan standar Anda, jadi Anda mungkin perlu mengubah susunannya. Susunan SQL Server default adalah SQL_Latin1_General_CP1_CI_AS. Mengubah susunan pada tingkat instance SQL tidak mudah. Ini membutuhkan skrip semua objek dalam database pengguna, mengekspor data, menjatuhkan database pengguna, membangun kembali database master dengan susunan baru, membuat database pengguna dan kemudian mengimpor semua data. Jadi, jika Anda menginstal contoh SQL baru, pastikan Anda mendapatkan susunan yang benar pertama kali, jika tidak, Anda mungkin harus melakukan banyak pekerjaan yang tidak diinginkan nanti. Menjelaskan secara rinci tahapan untuk mengubah susunan pada tingkat instance berada di luar cakupan artikel ini karena langkah-langkah mendetail yang diperlukan untuk setiap tahapan.

Mengubah susunan di tingkat basis data

Untungnya, mengubah susunan level basis data tidak sesulit mengubah susunan instance. Kami dapat memperbarui susunan menggunakan SSMS dan T-SQL. Di SSMS, cukup klik kanan database, buka "Properties" dan klik tab "Options" di sisi kiri. Di sana, Anda dapat melihat opsi untuk mengubah susunan di menu tarik-turun.

Klik "OK" setelah selesai. Saya baru saja mengubah susunan basis data menjadi SQL_Latin1_General_CP1_CI_AS. Pastikan saja, Anda melakukan operasi ini saat database tidak digunakan karena operasi akan gagal jika tidak seperti yang ditunjukkan di bawah ini.

Gunakan kueri lanjutan untuk mengubah susunan basis data menggunakan T-SQL.

USE master;  
GO  
ALTER DATABASE mo  
COLLATE SQL_Latin1_General_CP1_CS_AS;  
GO

Anda akan melihat bahwa mengubah susunan tingkat basis data tidak akan memengaruhi susunan kolom yang ada dalam tabel. Anda dapat menggunakan contoh sebelumnya untuk memeriksa dampak susunan pada urutan pengurutan untuk kueri di bawah ini.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS 
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – - this is default

Susunan kolom fname akan tetap menjadi yang asli dan tidak akan berubah bahkan setelah mengubah susunan tingkat basis data.

Namun, susunan tingkat database baru akan diterapkan untuk semua kolom baru di tabel baru yang akan Anda buat. Jadi, selalu uji perubahan susunan basis data secara menyeluruh karena memiliki dampak yang cukup besar pada keluaran atau perilaku kueri.

Mengubah susunan di tingkat kolom

Di bagian sebelumnya, Anda memperhatikan bahwa bahkan setelah mengubah susunan tingkat basis data, susunan kolom yang ada di tabel tetap tidak berubah. Di bagian ini, kita akan melihat bagaimana kita bisa mengubah susunan kolom yang ada di tabel agar sesuai dengan susunan database. Di bagian sebelumnya, Anda mengubah susunan basis data menjadi SQL_Latin1_General_CP1_CS_AS. Selanjutnya, Anda ingin mengidentifikasi semua kolom di tabel pengguna yang tidak cocok dengan susunan database ini. Anda dapat menggunakan skrip ini untuk mengidentifikasi kolom tersebut.

select so.name TableName,sc.name ColumnName, sc.collation_name CollationName from
sys.objects so inner join sys.columns sc on so.object_id=sc.object_id
where sc.collation_name!='SQL_Latin1_General_CP1_CS_AS' and so.[type] ='U'

Output sampel dari database demo saya adalah seperti yang ditunjukkan di bawah ini.

Misalkan Anda ingin mengubah susunan kolom fname yang ada menjadi “SQL_Latin1_General_CP1_CS_AS”, maka Anda dapat menggunakan skrip perubahan di bawah ini.

use mo
go
ALTER TABLE dbo.emp ALTER COLUMN fname  
            nvarchar(20) COLLATE SQL_Latin1_General_CP1_CS_AS NULL;  
GO

Jika Anda menggunakan contoh sebelumnya di mana Anda memeriksa kinerja kueri menggunakan susunan yang berbeda, Anda akan melihat bahwa operator "hitung skalar" tidak digunakan saat kami menggunakan susunan yang sama seperti yang ada di database. Lihat tangkapan layar di bawah ini. Pada contoh sebelumnya, Anda mungkin memperhatikan operator "Hitung skalar" yang digunakan dalam rencana eksekusi pertama. Saat kami mengubah susunan kolom agar sesuai dengan susunan database, konversi implisit tidak diperlukan. Anda akan melihat operator “Hitung skalar” di kueri kedua karena operator tersebut menggunakan susunan yang berbeda secara eksplisit.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS – - this is default
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS

Bisakah kita mengubah susunan database sistem?

Mengubah susunan database sistem tidak dimungkinkan. Jika Anda mencoba mengubah susunan database sistem – master, model, msdb atau tempdb, Anda akan mendapatkan pesan kesalahan ini.

Anda harus mengikuti langkah-langkah yang diuraikan sebelumnya tentang mengubah susunan di tingkat contoh SQL Server untuk mengubah susunan database sistem. Sangat penting untuk mendapatkan susunan yang benar saat pertama kali Anda menginstal SQL Server untuk menghindari masalah seperti itu.

Masalah umum tentang konflik penyusunan

Masalah umum lainnya yang mungkin Anda temukan adalah kesalahan yang terkait dengan konflik pemeriksaan terutama saat menggunakan objek sementara. Objek sementara disimpan di file tempdb. tempdb yang menjadi database sistem akan mengasumsikan susunan instance SQL. Saat Anda membuat database pengguna yang memiliki susunan selain dari contoh SQL, Anda akan mengalami masalah saat menggunakan objek sementara. Anda mungkin juga menghadapi masalah saat membandingkan kolom dalam tabel yang memiliki susunan berbeda. Sekarang, Anda sudah tahu bahwa tabel dapat memiliki kolom dengan susunan yang berbeda karena kami tidak dapat mengubah susunan di tingkat tabel. Pesan kesalahan umum yang akan Anda perhatikan adalah sesuatu seperti "Tidak dapat menyelesaikan konflik susunan antara" Penyusunan1" dan "Penyusunan2" dalam operasi yang sama." Collation1 dan Collation2 dapat berupa susunan apa pun yang digunakan dalam kueri. Dengan menggunakan contoh sederhana, kita dapat menghasilkan demo konflik susunan ini. Jika Anda telah menyelesaikan contoh sebelumnya di artikel ini, Anda akan memiliki tabel bernama "emp". Cukup buat tabel sementara di database demo Anda dan masukkan catatan menggunakan contoh skrip yang disediakan.

create table #emptemp
(id int,
 fname nvarchar(20))

insert into  #emptemp
select * from emp

Jalankan gabungan menggunakan kedua tabel dan Anda akan mendapatkan kesalahan konflik susunan seperti yang ditunjukkan di bawah ini.

select e.id, et.fname 
from emp e inner join #emptemp et
on e.fname=et.fname

Anda akan melihat bahwa susunan basis data pengguna yang digunakan adalah "SQL_Latin1_General_CP1_CS_AS" dan tidak cocok dengan susunan server. Untuk memperbaiki jenis kesalahan ini, Anda dapat mengubah kolom yang digunakan di objek sementara untuk menggunakan pemeriksaan default database pengguna. Anda dapat menggunakan opsi "database_default" atau secara eksplisit memberikan nama pemeriksaan database pengguna. Dalam contoh ini, kami menggunakan susunan "SQL_Latin1_General_CP1_CS_AS". Coba salah satu opsi ini
Opsi 1: Gunakan opsi database_default

alter table #emptemp alter column
 fname nvarchar(20) collate database_default

Setelah selesai, jalankan pernyataan pilih lagi dan kesalahan akan diperbaiki.
Opsi 2: Gunakan susunan basis data pengguna secara eksplisit

alter table #emptemp alter column
 fname nvarchar(20) collate SQL_Latin1_General_CP1_CS_AS

Setelah selesai, jalankan pernyataan pilih lagi dan kesalahan akan diperbaiki.

Kesimpulan

Dalam artikel ini, Anda menemukan tentang:
• konsep collation
• pilihan collation berbeda yang tersedia
• menemukan detail collation untuk setiap instance SQL, database, dan kolom
• A CONTOH KERJA dalam mencoba opsi susunan dalam kueri SQL
• mengubah susunan pada tingkat instans, tingkat basis data, dan tingkat kolom
• BAGAIMANA CARA mengubah susunan basis data sistem
• konflik susunan dan bagaimana untuk memperbaikinya

Sekarang Anda tahu tentang pentingnya collation dan pentingnya mengonfigurasi collation yang benar pada instance SQL dan juga di seluruh objek database. Selalu uji berbagai skenario di lingkungan pengujian Anda sebelum menerapkan salah satu opsi di atas pada sistem produksi Anda.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bangun tanggal dari nomor tahun dan minggu di MSSQL

  2. Bagaimana cara mendekripsi kata sandi dari SQL server?

  3. Tentang Perintah GO di SQL Server

  4. Bagaimana cara meneruskan parameter ke kueri mssql di node js

  5. Cara meringkas bidang waktu di SQL Server