Kami pindah dari SQL 2005 [Instance dan DB memiliki collation of SQL_Latin1_General_CP1_CI_AS
] ke SQL 2008 [yang default ke Latin1_General_CI_AS
].
Saya menyelesaikan instalasi SQL 2008 R2, dan menggunakan Latin1_General_CI_AS
collation default , dengan pemulihan database masih berjalan SQL_Latin1_General_CP1_CI_AS
. Masalah yang dikecualikan terjadi - tabel #temp di mana Latin1_General_CI_AS
sementara db berada di SQL_Latin1_General_CP1_CI_AS
dan di sinilah saya sekarang - saya perlu saran tentang perangkap sekarang.
Pada instalasi SQL 2008 R2, saya memiliki pilihan pada instalasi untuk penggunaan 'SQL Collation, used for backwards compatibility'
di mana saya memiliki pilihan untuk memilih pemeriksaan yang sama seperti database 2005: SQL_Latin1_General_CP1_CI_AS
.
Ini akan memungkinkan saya untuk tidak memiliki masalah dengan tabel #temp, tetapi apakah ada jebakan?
Apakah saya akan kehilangan fungsionalitas atau fitur apa pun dengan tidak menggunakan susunan SQL 2008 "terkini"?
- Bagaimana ketika kita pindah (misalnya dalam 2 tahun) dari 2008 ke SQL 2012? Apakah saya akan memiliki masalah?
Apakah saya akan dipaksa untuk pergi ke suatu titik
Latin1_General_CI_AS
?Saya membaca bahwa beberapa skrip DBA melengkapi deretan basis data lengkap, dan kemudian menjalankan skrip sisipkan ke dalam basis data dengan susunan baru - saya sangat takut dan waspada terhadap hal ini - apakah Anda akan merekomendasikan melakukan ini?
sumber
Jawaban:
Pertama-tama, permintaan maaf atas jawaban yang begitu panjang, karena saya merasa masih ada banyak kebingungan ketika orang berbicara tentang istilah seperti susunan, susunan urutan, halaman kode, dll.
Dari BOL :
Ini berarti bahwa Collation sangat penting karena menetapkan aturan tentang bagaimana string karakter data diurutkan dan dibandingkan.
Catatan: Info lebih lanjut tentang COLLATIONPROPERTY
Sekarang mari kita pahami perbedaannya ......
Berjalan di bawah T-SQL:
Hasilnya adalah:
Melihat hasil di atas, satu-satunya perbedaan adalah Urutan Urutan antara 2 pemeriksaan. Tapi itu tidak benar, yang dapat Anda lihat mengapa seperti di bawah ini:
Tes 1:
Hasil Uji 1:
Dari hasil di atas kita dapat melihat bahwa kita tidak dapat secara langsung membandingkan nilai pada kolom dengan susunan berbeda, Anda harus menggunakan
COLLATE
untuk membandingkan nilai kolom.UJI 2:
Perbedaan utama adalah kinerja, seperti yang ditunjukkan oleh Erland Sommarskog pada diskusi ini di msdn .
--- Buat Indeks pada kedua tabel
--- Jalankan kueri
--- Ini akan memiliki Konversi IMPLICIT
--- Jalankan kueri
--- Ini TIDAK akan memiliki Konversi IMPLICIT
Alasan untuk konversi implisit adalah karena, saya memiliki database & Server collation saya sebagai
SQL_Latin1_General_CP1_CI_AS
dan tabel Table_Latin1_General_CI_AS memiliki kolom Komentar didefinisikanVARCHAR(50)
dengan COLLATE Latin1_General_CI_AS , jadi selama pencarian SQL Server harus melakukan konversi IMPLICIT.Tes 3:
Dengan pengaturan yang sama, sekarang kita akan membandingkan kolom varchar dengan nilai nvarchar untuk melihat perubahan dalam rencana eksekusi.
- jalankan kueri
- jalankan kueri
Perhatikan bahwa permintaan pertama dapat melakukan pencarian Indeks tetapi harus melakukan konversi implisit sementara yang kedua melakukan pemindaian Indeks yang terbukti tidak efisien dalam hal kinerja ketika akan memindai tabel besar.
Kesimpulan:
SQL_Latin1_General_CP1_CI_AS
SQL collation dengan aturan yang memungkinkan Anda untuk mengurutkan data untuk unicode dan non-unicode berbeda.Latin1_General_CI_AS
adalah susunan Windows dengan aturan yang memungkinkan Anda untuk mengurutkan data untuk unicode dan non-unicode adalah sama.Lihat jawaban saya di atas.
Itu semua tergantung pada fungsi / fitur apa yang Anda maksud. Collation menyimpan dan menyortir data.
Tidak bisa menjamin! Karena hal-hal mungkin berubah dan selalu baik untuk sejalan dengan saran Microsoft + Anda harus memahami data Anda dan jebakan yang saya sebutkan di atas. Lihat juga item ini dan item terhubung ini .
Saat Anda ingin mengubah susunan, maka skrip seperti itu berguna. Saya menemukan diri saya mengubah susunan basis data agar sesuai dengan susunan server berkali-kali dan saya memiliki beberapa skrip yang melakukannya dengan cukup rapi. Beri tahu saya jika Anda membutuhkannya.
Referensi :
sumber
Selain apa yang @Kin terinci dalam jawabannya , ada beberapa hal lagi yang harus diperhatikan ketika mengganti susunan standar server (yaitu instance) (item di atas garis horizontal secara langsung relevan dengan dua pemeriksaan yang disebutkan dalam Pertanyaan; item di bawah garis horizontal relevan dengan umum):
JIKA KOLABASI DEFAULT DATABASE ANDA TIDAK BERUBAH, maka masalah kinerja "konversi implisit" yang dijelaskan dalam jawaban @ Kin seharusnya tidak menjadi masalah karena string literal dan variabel lokal menggunakan Collation default Database, bukan server. Satu-satunya dampak untuk skenario di mana tingkat instance Collation diubah tetapi tidak tingkat database Collation adalah (keduanya dijelaskan secara rinci di bawah):
Satu perbedaan antara kedua Collations ini adalah bagaimana mereka mengurutkan karakter tertentu untuk
VARCHAR
data (ini tidak mempengaruhiNVARCHAR
data).SQL_
Collations non-EBCDIC menggunakan apa yang disebut "Sort String" untukVARCHAR
data, sedangkan semua Collations lain, dan bahkanNVARCHAR
data untukSQL_
Collations non-EBCDIC , menggunakan apa yang disebut "Word Sort". Perbedaannya adalah bahwa dalam "Word Sort", tanda hubung-
dan tanda kutip'
(dan mungkin beberapa karakter lain?) Diberi bobot yang sangat rendah dan pada dasarnya diabaikan kecuali tidak ada perbedaan lain dalam string. Untuk melihat perilaku ini dalam tindakan, jalankan yang berikut:Pengembalian:
dan:
Meskipun Anda akan "kehilangan" perilaku "String Sort", saya tidak yakin bahwa saya akan menyebutnya "fitur". Ini adalah perilaku yang telah dianggap tidak diinginkan (sebagaimana dibuktikan oleh fakta bahwa itu tidak dibawa ke dalam salah satu dari kumpulan Windows). Namun, ini adalah perbedaan perilaku yang pasti antara kedua pemeriksaan (sekali lagi, hanya untuk
VARCHAR
data non-EBCDIC ), dan Anda mungkin memiliki kode dan / atau harapan pelanggan berdasarkan pada perilaku "String Sort". Ini membutuhkan pengujian kode Anda dan mungkin meneliti untuk melihat apakah perubahan perilaku ini dapat berdampak negatif pada pengguna.Perbedaan lain antara
SQL_Latin1_General_CP1_CI_AS
danLatin1_General_100_CI_AS
adalah kemampuan untuk melakukan Ekspansi padaVARCHAR
data (NVARCHAR
data sudah dapat melakukan ini untuk sebagian besarSQL_
Collations), seperti menanganiæ
seolah-olahae
:Pengembalian:
Satu-satunya hal yang Anda "kehilangan" di sini adalah tidak bisa melakukan ekspansi ini. Secara umum, ini adalah manfaat lain dari pindah ke Windows Collation. Namun, seperti halnya dengan pemindahan "String Sort" ke "Word Sort", kehati-hatian yang sama berlaku: itu adalah perbedaan perilaku yang pasti antara kedua kumpulan (sekali lagi, hanya untuk
VARCHAR
data), dan Anda mungkin memiliki kode dan / atau pelanggan harapan berdasarkan tidak memiliki pemetaan ini. Ini membutuhkan pengujian kode Anda dan mungkin meneliti untuk melihat apakah perubahan perilaku ini dapat berdampak negatif pada pengguna.(pertama kali dicatat dalam jawaban SO ini oleh @Zarepheth: Dapatkah SQL Server SQL_Latin1_General_CP1_CI_AS dikonversi dengan aman ke Latin1_General_CI_AS? )
Collation tingkat server digunakan untuk mengatur collation dari database sistem, yang mencakup
[model]
. Basis[model]
data digunakan sebagai templat untuk membuat basis data baru, yang termasuk[tempdb]
pada setiap permulaan server. Tetapi, bahkan dengan perubahan susunan tingkat server mengubah susunan[tempdb]
, ada cara yang agak mudah untuk memperbaiki perbedaan susunan antara database yang "saat ini" ketikaCREATE #TempTable
dieksekusi dan[tempdb]
. Saat membuat tabel sementara, nyatakan sebuah collation menggunakanCOLLATE
klausa dan tentukan collation dariDATABASE_DEFAULT
:Cara terbaik adalah menggunakan versi terbaru dari susunan yang diinginkan, jika beberapa versi tersedia. Mulai di SQL Server 2005, serangkaian "90" koleksi diperkenalkan, dan SQL Server 2008 memperkenalkan serangkaian "100" koleksi. Anda dapat menemukan kumpulan ini dengan menggunakan pertanyaan berikut:
Karena Anda berada di SQL Server 2008 R2, Anda harus menggunakan
Latin1_General_100_CI_AS
bukanLatin1_General_CI_AS
.Perbedaan antara versi peka huruf besar dari kumpulan khusus ini (yaitu
SQL_Latin1_General_CP1_CS_AS
danLatin1_General_100_CS_AS
) adalah dalam urutan huruf besar dan huruf kecil ketika melakukan penyortiran peka terhadap huruf besar-kecil. Ini juga mempengaruhi rentang kelas karakter tunggal (yaitu[start-end]
) yang dapat digunakan denganLIKE
operator danPATINDEX
fungsi. Tiga kueri berikut menunjukkan efek ini untuk pengurutan dan rentang karakter .:Satu-satunya cara untuk mendapatkan huruf besar untuk mengurutkan sebelum huruf kecil (untuk huruf yang sama) adalah dengan menggunakan salah satu dari 31 Collations yang mendukung perilaku itu, yang merupakan
Hungarian_Technical_*
Collations dan beberapaSQL_
Collations (yang hanya mendukung perilaku ini untukVARCHAR
data ).Kurang penting untuk perubahan khusus ini, tetapi masih bagus untuk diketahui karena akan berdampak jika mengubah server menjadi gabungan biner atau peka huruf besar kecil, adalah bahwa tingkat tingkatan server juga mempengaruhi:
sysname
datatypeArtinya, jika Anda atau "programmer yang pergi baru-baru ini" yang tampaknya bertanggung jawab untuk semua kode buruk ;-) tidak berhati-hati tentang casing dan menyatakan variabel sebagai
@SomethingID
tetapi kemudian menyebutnya sebagai@somethingId
nanti, itu akan pecah jika pindah ke case -sensitif atau biner. Demikian pula, kode yang menggunakansysname
datatype tetapi menyebutnya sebagaiSYSNAME
,,SysName
atau sesuatu selain dari semua huruf kecil juga akan rusak jika dipindahkan ke instance menggunakan case-sensitive atau binary collation.sumber