Saya punya permintaan SQL untuk membuat database di SQLServer seperti yang diberikan di bawah ini:
create database yourdb
on
( name = 'yourdb_dat',
filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf',
size = 25mb,
maxsize = 1500mb,
filegrowth = 10mb )
log on
( name = 'yourdb_log',
filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdblog.ldf',
size = 7mb,
maxsize = 375mb,
filegrowth = 10mb )
COLLATE SQL_Latin1_General_CP1_CI_AS;
go
Ini berjalan dengan baik.
Sementara sisa dari SQL jelas saya cukup bingung tentang fungsi COLLATE SQL_Latin1_General_CP1_CI_AS
.
Adakah yang bisa menjelaskan hal ini kepada saya? Juga, saya ingin tahu apakah membuat database dengan cara ini merupakan praktik terbaik?
sql-server
database
tsql
collation
Guntur
sumber
sumber
SQL_Latin1_General_CI_AS
. Secara khusus, CP1 membuat saya bertanya-tanya.SQL_Latin1_General_CI_AS
. Sebaliknya, ada aLatin1_General_CI_AS
. LihatSELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');
. Ada perbedaan yang halus tentang penyortiran dan perbandingan antara kedua pemeriksaan. Lihat olcot.co.uk/sql-blogs/… .Perlu diketahui bahwa jawaban yang diterima agak tidak lengkap. Ya, pada tingkat paling dasar Collation menangani pengurutan. NAMUN, aturan perbandingan yang ditentukan oleh Kolasi yang dipilih digunakan di banyak tempat di luar permintaan pengguna terhadap data pengguna.
Jika "Apa fungsinya
COLLATE SQL_Latin1_General_CP1_CI_AS
?" berarti "Apa yang dilakukanCOLLATE
klausaCREATE DATABASE
?", lalu:The
COLLATE {collation_name}
klausulCREATE DATABASE
pernyataan menentukan Terbit default dari database , dan tidak Server; Tingkatan standar Basis data dan tingkat Server mengontrol berbagai hal.Kontrol tingkat server (mis. Instance) :
master
,model
,msdb
, dantempdb
.tempdb
, maka itu adalah Collation default untuk kolom string dalam tabel sementara (global dan lokal), tetapi bukan variabel tabel.master
, maka Collation digunakan untuk data tingkat Server , seperti nama Database (yaituname
kolom disys.databases
), nama Login, dll.GOTO
labelCOLLATE
klausa hilangKontrol tingkat basis data :
CHAR
,VARCHAR
,NCHAR
,NVARCHAR
,TEXT
, danNTEXT
- tapi tidak menggunakanTEXT
atauNTEXT
) ketikaCOLLATE
klausul yang hilang dari definisi kolom. Ini berlaku untuk keduanyaCREATE TABLE
danALTER TABLE ... ADD
pernyataan.'some text'
) dan variabel string (yaitu@StringVariable
). Collation ini hanya digunakan saat membandingkan string dan variabel dengan string dan variabel lain. Saat membandingkan string / variabel ke kolom, maka Kolasi kolom akan digunakan.sys.objects
), nama kolom (yaitusys.columns
), nama indeks (yaitusys.indexes
), dll.Juga:
Latin1
tidak tidak berarti "ASCII" karena standar ASCII hanya mencakup nilai-nilai 0-127, dan semua halaman kode (yang dapat diwakili dalam SQL Server, dan bahkanNVARCHAR
) memetakan 128 nilai-nilai yang sama dengan karakter yang sama.Jika "Apa fungsinya
COLLATE SQL_Latin1_General_CP1_CI_AS
?" berarti "Apa yang dilakukan pemeriksaan khusus ini?", lalu:Karena namanya dimulai dengan
SQL_
, ini adalah SQL Server collation, bukan Windows collation. Ini jelas usang, bahkan jika tidak secara resmi usang, dan terutama untuk kompatibilitas pra-SQL Server 2000. Meskipun, sayangnyaSQL_Latin1_General_CP1_CI_AS
sangat umum karena menjadi default ketika menginstal pada OS menggunakan bahasa Inggris AS sebagai bahasanya. Koleksi ini harus dihindari jika memungkinkan.Windows collations (yang dengan nama tidak dimulai dengan
SQL_
) lebih baru, lebih fungsional, memiliki penyortiran yang konsisten antaraVARCHAR
danNVARCHAR
untuk nilai yang sama, dan sedang diperbarui dengan tambahan bobot / dikoreksi dan pemetaan huruf besar / kecil. Kumpulan ini juga tidak memiliki masalah kinerja potensial yang dimiliki oleh kumpulan SQL Server: Dampak pada Indeks Saat Memadukan Jenis VARCHAR dan NVARCHAR .Latin1_General
adalah budaya / lokal.NCHAR
,,NVARCHAR
danNTEXT
data ini menentukan aturan linguistik yang digunakan untuk menyortir dan membandingkan.CHAR
,,VARCHAR
danTEXT
data (kolom, literal, dan variabel) ini menentukan:Latin1_General
pengumpulan menggunakan halaman kode 1252,Hebrew
pengumpulan menggunakan halaman kode 1255, dan sebagainya.CP{code_page}
atau{version}
CP{code_page}
adalah halaman kode 8-bit yang menentukan karakter apa yang dipetakan ke nilai 128 - 255. Sementara ada empat halaman kode untuk Double-Byte Character Sets (DBCS) yang dapat menggunakan kombinasi 2-byte untuk membuat lebih dari 256 karakter, ini tidak tersedia untuk kumpulan SQL Server.Untuk Windows collations:,
{version}
sementara tidak ada dalam semua nama collation, merujuk ke versi SQL Server di mana collation diperkenalkan (sebagian besar). Windows collations tanpa nomor versi dalam nama adalah versi80
(berarti SQL Server 2000 karena itu adalah versi 8.0). Tidak semua versi SQL Server datang dengan collations baru, jadi ada celah di nomor versi. Ada beberapa yang90
(untuk SQL Server 2005, yang merupakan versi 9.0), sebagian besar100
(untuk SQL Server 2008, versi 10.0), dan satu set kecil memiliki140
(untuk SQL Server 2017, versi 14.0).Saya mengatakan "sebagian besar" karena kumpulan yang berakhir
_SC
diperkenalkan pada SQL Server 2012 (versi 11.0), tetapi data yang mendasarinya tidak baru, mereka hanya menambahkan dukungan untuk karakter tambahan untuk fungsi bawaan. Jadi, ujung-ujung itu ada untuk versi90
dan100
kumpulan, tetapi hanya dimulai pada SQL Server 2012.CS
= case-sensitive atauCI
= case-sensitiveAS
= peka-aksen atauAI
= peka-aksenKS
= Tipe Kana sensitif atau hilang = Tipe Kana tidak sensitifWS
= width-sensitive atau missing = width tidak sensitifVSS
= variasi pemilih sensitif (hanya tersedia dalam versi 140 collations) atau hilang = variasi pemilih tidak sensitifBagian terakhir opsional:
_SC
pada akhirnya berarti "Dukungan Karakter Tambahan". "Dukungan" hanya memengaruhi bagaimana fungsi bawaan menafsirkan pasangan pengganti (yang merupakan bagaimana karakter tambahan dikodekan dalam UTF-16). Tanpa_SC
di akhir (atau_140_
di tengah), fungsi bawaan tidak melihat satu karakter tambahan, melainkan melihat dua titik kode tidak berarti yang membentuk pasangan pengganti. Akhiran ini dapat ditambahkan ke sembarang non-biner, versi 90 atau 100._BIN
atau_BIN2
pada akhirnya berarti penyortiran dan perbandingan "biner". Data masih tersimpan sama, tetapi tidak ada aturan linguistik. Akhir cerita ini tidak pernah digabungkan dengan 5 sensitivitas atau_SC
._BIN
adalah gaya yang lebih lama, dan_BIN2
merupakan gaya yang lebih baru dan lebih akurat. Jika menggunakan SQL Server 2005 atau yang lebih baru, gunakan_BIN2
. Untuk perincian tentang perbedaan antara_BIN
dan_BIN2
, silakan lihat: Perbedaan Antara Berbagai Binary Collations (Cultures, Version, dan BIN vs BIN2) ._UTF8
adalah opsi baru pada SQL Server 2019. Ini adalah penyandian 8-bit yang memungkinkan data Unicode disimpanVARCHAR
danCHAR
tipe data (tetapi bukanTEXT
tipe data yang ditinggalkan ). Opsi ini hanya dapat digunakan pada collations yang mendukung karakter tambahan (yaitu versi 90 atau 100 collations dengan_SC
nama mereka, dan collations versi 140). Ada juga satu_UTF8
kumpulan biner (_BIN2
, bukan_BIN
).PLEASE NOTE: UTF-8 dirancang / dibuat untuk kompatibilitas dengan lingkungan / kode yang diatur untuk penyandian 8-bit namun ingin mendukung Unicode. Meskipun ada beberapa skenario di mana UTF-8 dapat memberikan penghematan ruang hingga 50% dibandingkan dengan
NVARCHAR
, itu adalah efek samping dan memiliki biaya sedikit hit untuk kinerja di banyak / sebagian besar operasi. Jika Anda memerlukan ini untuk kompatibilitas, maka biayanya dapat diterima. Jika Anda menginginkan ini untuk menghemat ruang, Anda memiliki tes yang lebih baik, dan TEST LAGI. Pengujian mencakup semua fungsionalitas, dan lebih dari beberapa baris data. Berhati-hatilah bahwa UTF-8 collations bekerja paling baik ketika SEMUA kolom, dan database itu sendiri, menggunakanVARCHAR
data (kolom, variabel, string literal) dengan_UTF8
pemeriksaan. Ini adalah keadaan alami bagi siapa saja yang menggunakan ini untuk kompatibilitas, tetapi tidak bagi mereka yang berharap menggunakannya untuk menghemat ruang. Berhati-hatilah saat mencampur data VARCHAR menggunakan_UTF8
collation denganVARCHAR
data yang menggunakan non-_UTF8
collations atauNVARCHAR
data, karena Anda mungkin mengalami perilaku aneh / kehilangan data. Untuk detail lebih lanjut tentang koleksi UTF-8 baru, silakan lihat: Dukungan asli UTF-8 di SQL Server 2019: Juruselamat atau Nabi Palsu?sumber
COLLATE
klausaCREATE DATABASE
lakukan. Anda mengatakan salah satu dari beberapa hal yang dilakukannya. Mengapa Anda berasumsi bahwa OP hanya ingin tahu 10% dari jawabannya? Jika semua info disajikan, setiap orang dapat memutuskan berapa banyak yang harus diambil. Tetapi jika hanya beberapa info yang diberikan, maka pilihan dibuat untuk mereka. Saya memilih untuk memberikan info sebanyak mungkin karena sebagian besar tidak diketahui. (lanjutan)CP1 berarti 'Kode Halaman 1' - secara teknis ini berarti kode halaman 1252
sumber
The Collate kata kunci menentukan jenis set karakter dan aturan (order, aturan konfrontasi) yang Anda gunakan untuk nilai string.
Misalnya dalam kasus Anda, Anda menggunakan aturan Latin dengan case insensitive ( CI ) dan accent sensitive ( AS )
Anda dapat merujuk ke Dokumentasi ini
sumber
Ini menentukan susunan standar untuk basis data. Setiap bidang teks yang Anda buat dalam tabel di database akan menggunakan susunan itu, kecuali jika Anda menentukan yang lain.
Database selalu memiliki susunan standar. Jika Anda tidak menentukan apa pun, susunan standar turunan SQL Server digunakan.
Nama susunan yang Anda gunakan menunjukkan bahwa ia menggunakan kode Latin1 halaman 1, tidak sensitif huruf (CI) dan peka aksen (AS). Susunan ini digunakan di AS, sehingga akan berisi aturan penyortiran yang digunakan di AS.
Kolasi memutuskan bagaimana nilai-nilai teks dibandingkan untuk persamaan dan persamaan, dan bagaimana nilai-nilai itu dibandingkan saat menyortir. Halaman kode digunakan ketika menyimpan data non-unicode, misalnya bidang varchar.
sumber
not
menentukan collation, meskipun Anda dapat menerima default) salah (ini digunakan untuk data unicode juga)Latin1_General_CI_AS
. Sekarang saya membacanya salah karena saya setengah berharap pernyataan itu tentang SERVER collation yang memang memerlukan penerimaan default di UI. Untuk poin ke-2, Anda tampaknya menyiratkan bahwa collation tidak digunakan untuk mengurutkan data unicode (meskipun Anda beralih darisorting
kestoring
dalam 2 kalimat terakhir). Data teks Unicode juga mematuhi pengumpulan.