Apa yang dilakukan 'COLLATE SQL_Latin1_General_CP1_CI_AS'?

134

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?

Guntur
sumber

Jawaban:

246

Ini mengatur bagaimana server database mengurutkan (membandingkan potongan teks). pada kasus ini:

SQL_Latin1_General_CP1_CI_AS

dipecah menjadi bagian-bagian yang menarik:

  1. latin1 membuat server memperlakukan string menggunakan charset latin 1, pada dasarnya ascii
  2. CP1 singkatan dari Code Page 1252
  3. CI perbandingan kasus tidak sensitif sehingga 'ABC' akan sama dengan 'abc'
  4. AS aksen peka, jadi 'ü' tidak sama dengan 'u'

PS Untuk informasi lebih rinci pastikan untuk membaca jawaban @ solomon-rutzky .

Keris
sumber
11
Apa perbedaan antara ini dan SQL_Latin1_General_CI_AS. Secara khusus, CP1 membuat saya bertanya-tanya.
Kad
7
@ Kak: Sepertinya tidak ada a SQL_Latin1_General_CI_AS. Sebaliknya, ada a Latin1_General_CI_AS. Lihat SELECT * 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/… .
Riley Major
4
@ Kad: CP1 adalah singkatan dari Code Page 1252. Halaman kode adalah tabel pencarian untuk memetakan nilai hex ke karakter tertentu dalam set karakter. CP1 adalah singkatan untuk CP1252 dalam sub-budaya Microsoft. Windows adalah satu-satunya platform yang menggunakan CP1252 secara pribadi karena merupakan penahanan dari hari-hari DOS. Meskipun sangat mirip dengan ISO 8859-1, mereka tidak sama. Ada perbedaan dalam karakter yang dipetakan seperti euro dan beberapa lainnya yang tidak ada dalam ISO 8859-1.
slartibartfast
jawaban sempurna @ Kris!
gaurav
@Kris Apakah ada alternatif UTF-8 untuk SQL_Latin1_General_CP1_CI_AS di SQL2019?
Chanky
72

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 dilakukan COLLATEklausa CREATE DATABASE?", lalu:

The COLLATE {collation_name}klausul CREATE DATABASEpernyataan menentukan Terbit default dari database , dan tidak Server; Tingkatan standar Basis data dan tingkat Server mengontrol berbagai hal.

Kontrol tingkat server (mis. Instance) :

  • Fisik database-tingkat untuk Database sistem: master, model, msdb, dan tempdb.
  • Karena mengontrol Collation tingkat DB tempdb, maka itu adalah Collation default untuk kolom string dalam tabel sementara (global dan lokal), tetapi bukan variabel tabel.
  • Karena mengendalikan Collation tingkat DB master, maka Collation digunakan untuk data tingkat Server , seperti nama Database (yaitu namekolom di sys.databases), nama Login, dll.
  • Penanganan nama parameter / variabel
  • Penanganan nama kursor
  • Penanganan GOTOlabel
  • Default Collation digunakan untuk Database yang baru dibuat ketika COLLATEklausa hilang

Kontrol tingkat basis data :

  • Standar Fisik digunakan untuk kolom string yang baru dibuat ( CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT, dan NTEXT- tapi tidak menggunakan TEXTatau NTEXT) ketika COLLATEklausul yang hilang dari definisi kolom. Ini berlaku untuk keduanya CREATE TABLEdan ALTER TABLE ... ADDpernyataan.
  • Default Collation digunakan untuk string literal (yaitu '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.
  • Kolasi yang digunakan untuk meta-data tingkat Database , seperti nama objek (yaitu sys.objects), nama kolom (yaitu sys.columns), nama indeks (yaitu sys.indexes), dll.
  • Kolasi yang digunakan untuk objek tingkat Database : tabel, kolom, indeks, dll.

Juga:

  • ASCII adalah penyandian yang 8-bit (untuk penggunaan umum; secara teknis "ASCII" adalah 7-bit dengan nilai karakter 0 - 127, dan "ASCII Extended" adalah 8-bit dengan nilai karakter 0 - 255). Grup ini sama lintas budaya.
  • Halaman Kode adalah bagian "extended" dari Extended ASCII, dan mengontrol karakter mana yang digunakan untuk nilai 128 - 255. Grup ini bervariasi di antara setiap budaya.
  • Latin1tidak tidak berarti "ASCII" karena standar ASCII hanya mencakup nilai-nilai 0-127, dan semua halaman kode (yang dapat diwakili dalam SQL Server, dan bahkan NVARCHAR) 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, sayangnya SQL_Latin1_General_CP1_CI_ASsangat 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 antara VARCHARdan NVARCHARuntuk 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.
    • Untuk NCHAR,, NVARCHARdan NTEXTdata ini menentukan aturan linguistik yang digunakan untuk menyortir dan membandingkan.
    • Untuk CHAR,, VARCHARdan TEXTdata (kolom, literal, dan variabel) ini menentukan:
      • aturan linguistik yang digunakan untuk menyortir dan membandingkan.
      • halaman kode yang digunakan untuk menyandikan karakter. Misalnya, Latin1_Generalpengumpulan menggunakan halaman kode 1252, Hebrewpengumpulan menggunakan halaman kode 1255, dan sebagainya.
  • CP{code_page} atau {version}

    • Untuk SQL Server collations:, 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 versi 80(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 yang 90(untuk SQL Server 2005, yang merupakan versi 9.0), sebagian besar 100(untuk SQL Server 2008, versi 10.0), dan satu set kecil memiliki 140(untuk SQL Server 2017, versi 14.0).

      Saya mengatakan "sebagian besar" karena kumpulan yang berakhir _SCdiperkenalkan 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 versi 90dan 100kumpulan, tetapi hanya dimulai pada SQL Server 2012.

  • Selanjutnya Anda memiliki sensitivitas, yang dapat berupa kombinasi dari yang berikut, tetapi selalu ditentukan dalam urutan ini:
    • CS= case-sensitive atau CI= case-sensitive
    • AS= peka-aksen atau AI= peka-aksen
    • KS = Tipe Kana sensitif atau hilang = Tipe Kana tidak sensitif
    • WS = width-sensitive atau missing = width tidak sensitif
    • VSS = variasi pemilih sensitif (hanya tersedia dalam versi 140 collations) atau hilang = variasi pemilih tidak sensitif
  • Bagian terakhir opsional:

    • _SCpada akhirnya berarti "Dukungan Karakter Tambahan". "Dukungan" hanya memengaruhi bagaimana fungsi bawaan menafsirkan pasangan pengganti (yang merupakan bagaimana karakter tambahan dikodekan dalam UTF-16). Tanpa _SCdi 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.
    • _BINatau _BIN2pada 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. _BINadalah gaya yang lebih lama, dan _BIN2merupakan gaya yang lebih baru dan lebih akurat. Jika menggunakan SQL Server 2005 atau yang lebih baru, gunakan _BIN2. Untuk perincian tentang perbedaan antara _BINdan _BIN2, silakan lihat: Perbedaan Antara Berbagai Binary Collations (Cultures, Version, dan BIN vs BIN2) .
    • _UTF8adalah opsi baru pada SQL Server 2019. Ini adalah penyandian 8-bit yang memungkinkan data Unicode disimpan VARCHARdan CHARtipe data (tetapi bukan TEXTtipe data yang ditinggalkan ). Opsi ini hanya dapat digunakan pada collations yang mendukung karakter tambahan (yaitu versi 90 atau 100 collations dengan _SCnama mereka, dan collations versi 140). Ada juga satu _UTF8kumpulan 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, menggunakan VARCHARdata (kolom, variabel, string literal) dengan_UTF8pemeriksaan. 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 _UTF8collation dengan VARCHARdata yang menggunakan non- _UTF8collations atau NVARCHARdata, 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?

Solomon Rutzky
sumber
5
Walaupun saya tidak melakukan ini karena mengandung begitu banyak informasi dan usaha, jawaban saya jelas tidak salah (database menyimpan data, server database bertindak berdasarkan data ini, penyortiran bertindak). Saya memilih singkat daripada presisi matematika lengkap karena OP mungkin mencari cukup, tidak semua informasi mungkin.
Kris
4
Hai @ Kris. Terima kasih. Agar adil, saya tidak mengatakan bahwa jawaban Anda sepenuhnya salah, hanya saja tidak lengkap. Saya telah memperbarui agar mudah-mudahan menjelaskan itu. Saya mengerti apa yang Anda katakan, tetapi OP bertanya apa yang COLLATEklausa CREATE DATABASElakukan. 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)
Solomon Rutzky
5
Saya pikir saya mengerti maksud Anda, tetapi saya bermaksud memberikan informasi yang cukup daripada terlalu banyak. terlalu banyak informasi dengan cepat menjadi terlalu rumit untuk banyak orang. dan ketika saya gagal memberikan informasi yang cukup untuk keadaan apa pun saya akan mengharapkan pertanyaan lanjutan. (Saya juga tidak berharap cukup banyak perhatian pada topik ini)
Kris
8
@ Kris Saya telah lama bermaksud mengatakan "Terima kasih!" untuk menunjukkan kematangan dan profesionalisme. Saya agak terbiasa dengan orang yang melakukan pelanggaran pribadi kepada seseorang yang mengatakan bahwa mereka salah, dan kemudian menjadi "sulit" (atau bahkan lebih sulit) untuk berinteraksi dengannya. Tetapi, respons Anda yang terukur terhadap, "jawaban yang diterima SALAH " mengilhami saya untuk menurunkan intro saya, dan harus menjadi contoh bagi orang lain di sini tentang cara berkomunikasi dengan benar dan produktif 😺.
Solomon Rutzky
4
Terima kasih dan senang mendengar bahwa saya entah bagaimana membuat dampak positif, tetapi saya senang menjadi "salah", itu membuka peluang untuk mempelajari hal-hal baru, yang hebat!
Kris
24

CP1 berarti 'Kode Halaman 1' - secara teknis ini berarti kode halaman 1252

Chris Halcrow
sumber
16

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

il_guru
sumber
9

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.

Guffa
sumber
salah (Anda tidak dapat notmenentukan collation, meskipun Anda dapat menerima default) salah (ini digunakan untuk data unicode juga)
RichardTheKiwi
@ Richard alias cyberkiwi: Periksa dokumentasi: msdn.microsoft.com/en-us/library/ms176061.aspx Menentukan collation adalah opsional. Halaman kode tidak digunakan untuk menyimpan data Unicode, karena disimpan sebagai titik kode Unicode 16 bit, bukan sebagai indeks halaman kode 8 bit.
Guffa
Saya salah membaca jawaban Anda, tetapi masih salah. Basis data selalu memiliki susunan standar = susunan SERVER , tidak secara khusus 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 dari sortingke storingdalam 2 kalimat terakhir). Data teks Unicode juga mematuhi pengumpulan.
RichardTheKiwi
@ Richard alias cyberkiwi: Saya mengubah paragraf tentang susunan default agar sesuai dengan dokumentasi spesifik yang saya tautkan. (Ini berbeda tergantung pada versi server.) Mengenai poin kedua, saya tidak bisa melihat bagaimana saya bisa membuatnya lebih jelas. Teks mengatakan bahwa halaman kode digunakan ketika menyimpan data non-unicode. Halaman kode tidak digunakan untuk menentukan penyortiran, baik untuk data unicode atau untuk data non-unicode.
Guffa