'COLLATE SQL_Latin1_General_CP1_CI_AS' ne yapar?


134

Aşağıda verildiği gibi SQLServer'da veritabanı oluşturmak için bir SQL sorgusu var:

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

İyi çalışıyor.

SQL geri kalanı açık olmakla birlikte ben oldukça işlevselliği hakkında kafam karıştı COLLATE SQL_Latin1_General_CP1_CI_AS .

Bunu bana açıklayan var mı? Ayrıca, bu şekilde veritabanı oluşturmak iyi bir uygulama olup olmadığını bilmek istiyorum?

Yanıtlar:


246

Veritabanı sunucusunun nasıl sıralanacağını ayarlar (metin parçalarını karşılaştırır). bu durumda:

SQL_Latin1_General_CP1_CI_AS

ilginç parçalara ayrılıyor:

  1. latin1 charset latin 1, temelde ascii kullanarak sunucu dizeleri tedavi yapar
  2. CP1 Kod Sayfa 1252
  3. CI "ABC" nin "abc" e eşit olması için büyük / küçük harfe duyarlı olmayan karşılaştırmalar
  4. AS aksan duyarlı, yani 'ü' eşittir 'u'

PS Daha ayrıntılı bilgi için @ solomon-rutzky'nin cevabını mutlaka okuyun .


11
Bu ve arasındaki fark ne olurdu SQL_Latin1_General_CI_AS. Özellikle, CP1 beni meraklandırdı.
Kad

7
@Kad: Görünüşe göre bir SQL_Latin1_General_CI_AS. Aksine, bir vardır Latin1_General_CI_AS. Bkz SELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');. İki harmanlama arasında sıralama ve karşılaştırma konusunda küçük farklılıklar vardır. Bkz. Olcot.co.uk/sql-blogs/… .
Riley Major

4
@Kad: CP1, Kod Page 1252'yi ifade eder. Kod sayfası, onaltılık değeri bir karakter kümesindeki belirli bir karakterle eşleştirmek için bir arama tablosudur. CP1, Microsoft alt kültüründe CP1252 için kısaltmadır. Windows, DOS günlerinden bekletildiği için CP1252'yi yerli olarak kullanan tek platformdur. ISO 8859-1'e çok benzese de aynı değiller. Euro ve eşleştirilmiş karakterler gibi ISO 8859-1'de olmayan haritalanmış karakterlerde farklılıklar vardır.
slartibartfast

@Kris kusursuz cevap!
gaurav

@Kris SQL2019'da SQL_Latin1_General_CP1_CI_AS için UTF-8 alternatifi var mı?
Chanky

72

Lütfen kabul edilen cevabın biraz eksik olduğunu unutmayın. Evet, en temel düzeyde Harmanlama sıralamayı işler. ANCAK, seçilen Harmanlama tarafından tanımlanan karşılaştırma kuralları, kullanıcı sorguları dışındaki birçok yerde kullanıcı verilerine karşı kullanılır.

"Ne yapar COLLATE SQL_Latin1_General_CP1_CI_AS?" " COLLATEMadde ne CREATE DATABASEişe yarar ?"

COLLATE {collation_name}Maddesi hükümleri CREATE DATABASEifadesinin varsayılan Harmanlama belirten Veritabanı ve değil Sunucusu; Veritabanı düzeyinde ve Sunucu düzeyinde varsayılan Harmanlamalar farklı şeyleri kontrol eder.

Sunucu (örnek) düzeyi denetimleri:

  • Sistem Veritabanları için Veritabanı düzeyinde Harmanlama: master, model, msdb, ve tempdb.
  • DB düzeyinde Harmanlama kontrolü nedeniyle tempdb , geçici tablolardaki (genel ve yerel) dize sütunları için varsayılan Harmanlamadır, ancak tablo değişkenleri değildir.
  • DB düzeyi Harmanlama'nın denetlenmesi nedeniyle , Veritabanı adları (yani sütun girişi ), Oturum açma adları vb. Gibi Sunucu düzeyi veriler masteriçin kullanılan Harmanlamadır .namesys.databases
  • Parametre / değişken adlarının işlenmesi
  • İmleç adlarının işlenmesi
  • Kullanımı GOTO etiketler
  • Yan COLLATEtümce eksik olduğunda yeni oluşturulan Veritabanları için kullanılan Varsayılan Harmanlama

Veritabanı düzeyinde kontroller:

  • Standart Harmanlama yeni oluşturulan dize sütunlar için kullanılan ( CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT, ve NTEXT- ama kullanmayın TEXTveya NTEXT) ne zaman COLLATEfıkra sütun tanımı eksik. Bu ikisi için de geçerli CREATE TABLEveALTER TABLE ... ADD tablolar.
  • Dize değişmez değerleri (ie 'some text') ve dize değişkenleri (ie @StringVariable) için kullanılan Varsayılan Harmanlama . Bu Harmanlama yalnızca dizeleri ve değişkenleri diğer dizelerle ve değişkenlerle karşılaştırırken kullanılır. Dizeleri / değişkenleri sütunlarla karşılaştırırken, sütunun Harmanlaması kullanılır.
  • Nesne adları (ör. ), Sütun adları (ör. ), Dizin adları (ör. ) Vb. Gibi Veritabanı düzeyinde meta veriler için kullanılan Harmanlama .sys.objectssys.columnssys.indexes
  • Veritabanı düzeyindeki nesneler için kullanılan Harmanlama : tablolar, sütunlar, dizinler vb.

Ayrıca:

  • ASCII, 8 bitlik bir kodlamadır (ortak kullanım için; teknik olarak "ASCII", 0 - 127 karakter değerlerine sahip 7 bit ve "ASCII Extended", 0 - 255 karakter değerlerine sahip 8 bittir). Bu grup kültürler arasında aynıdır.
  • Kod Sayfası, Genişletilmiş ASCII'nin "genişletilmiş" kısmıdır ve 128 - 255 değerleri için hangi karakterlerin kullanıldığını denetler. Bu grup her kültür arasında değişiklik gösterir.
  • Latin1yok değil standart ASCII yalnızca değerleri 0 kapsaması nedeniyle "ASCII" demek - 127 ve tüm kod sayfalarının (yani SQL Server temsil ve hatta edilebilir NVARCHAR) aynı karakterlere bu aynı 128 değerleri map.

"Ne yapar?" COLLATE SQL_Latin1_General_CP1_CI_AS ?" "Bu özel harmanlama ne yapar?"

  • Çünkü adı SQL_ , bu bir Windows harmanlaması değil, bir SQL Server harmanlamasıdır. Bunlar, resmi olarak kullanımdan kaldırılmasalar bile kesinlikle kullanılmıyor ve esas olarak SQL Server 2000 öncesi uyumluluk içindir. Bununla birlikte, maalesef SQL_Latin1_General_CP1_CI_ASABD İngilizcesi'ni dil olarak kullanan bir işletim sistemine yüklenirken varsayılan olması nedeniyle maalesef çok yaygındır. Mümkünse bu harmanlamalardan kaçınılmalıdır.

    , Windows alfabe (isimler olanlar değil başlayarak SQL_), daha işlevsel, daha yeni arasında tutarlı sıralamayı var VARCHARve NVARCHARaynı değerler için ve ek / düzeltilmiş sıralama ağırlıkları ve büyük harf / küçük harf eşlemeleriyle güncellenmektedir. Bu harmanlamalarda ayrıca SQL Server harmanlamalarının olası performans sorunu yoktur: VARCHAR ve NVARCHAR Türlerini Karıştırırken Dizinler Üzerindeki Etkisi .

  • Latin1_General kültür / yerel ayardır.
    • İçin NCHAR, NVARCHARveNTEXT verilerin bu sıralama, ve kullanılan dil kurallar belirler.
    • İçin CHAR, VARCHARveTEXT verilerin (sütunlar, sabitler ve değişkenler) bu belirler:
      • sıralama ve karşılaştırma için kullanılan dil kuralları.
      • karakterleri kodlamak için kullanılan kod sayfası. Örneğin, Latin1_Generalharmanlamalar kod sayfası 1252'yi Hebrewkullanır , harmanlamalar kod sayfası 1255'i kullanır, vb.
  • CP{code_page} veya {version}

    • İçin SQL Server alfabe: CP{code_page}- Birden fazla oluşturmanın 2 baytlık kombinasyonlarını kullanabilirsiniz Çift baytlık karakter ayarlar (DBCS) için dört kod sayfaları varken 255, karakterler değerlere 128 eşlediğiniz belirler 8 bitlik kod sayfası 256 karakter, bunlar SQL Server harmanlama için kullanılamaz.
    • İçin , Windows alfabe: {version}Tüm harmanlama adlarında mevcut değil iken, harmanlama (çoğunlukla) uygulamaya girdiği SQL Server sürüm anlamına gelir. Adında sürüm numarası bulunmayan Windows harmanlamaları sürümdür 80(SQL Server 2000'in 8.0 sürümü olduğu anlamına gelir). SQL Server'ın tüm sürümleri yeni harmanlamalarla gelmez, bu nedenle sürüm numaralarında boşluklar vardır. Bazıları vardır 90(sürüm 9.0 olan SQL Server 2005 için), çoğu 100(SQL Server 2008, sürüm 10.0 için) ve küçük bir set 140(SQL Server 2017, sürüm 14.0 için) vardır.

      "Çoğunlukla" dedim, çünkü biten harmanlamalar _SCSQL Server 2012'de (sürüm 11.0) tanıtıldı, ancak temel alınan veriler yeni değildi, sadece yerleşik işlevler için ek karakterler için destek eklediler. Yani, bu sonlar sürüm 90ve 100harmanlamalar için var, ancak sadece SQL Server 2012'de başlıyor.

  • Daha sonra, aşağıdakilerin herhangi bir kombinasyonunda olabilecek, ancak her zaman bu sırayla belirtilen hassasiyetlere sahipsiniz:
    • CS= büyük / küçük harfe duyarlı veya CI= büyük / küçük harfe duyarlı değil
    • AS= aksan duyarlı veya AI= aksan duyarlı
    • KS = Kana tipine duyarlı veya eksik = Kana tipine duyarsız
    • WS = genişliğe duyarlı veya eksik = genişliğe duyarsız
    • VSS = varyasyon seçici duyarlı (yalnızca 140 harmanlamasında mevcuttur) veya eksik = varyasyon seçici duyarsız
  • İsteğe bağlı son parça:

    • _SCsonunda "Ek Karakter desteği" anlamına gelir. "Destek" yalnızca yerleşik işlevlerin vekil çiftleri nasıl yorumladığını etkiler (UTF-16'da ek karakterlerin nasıl kodlandığı). _SCSonunda (veya _140_ortasında) olmadan , yerleşik işlevler tek bir ek karakter görmez, bunun yerine vekil çifti oluşturan iki anlamsız kod noktası görür. Bu son, herhangi bir ikili olmayan, sürüm 90 veya 100 harmanlamaya eklenebilir.
    • _BINveya _BIN2sonunda "ikili" sıralama ve karşılaştırma anlamına gelir. Veriler hala aynı şekilde saklanmaktadır, ancak dil kuralları yoktur. Bu son asla 5 hassasiyetten hiçbiriyle birleştirilmez _SC. _BINeski stil ve _BIN2daha yeni, daha doğru stil. SQL Server 2005 veya daha yenisini kullanıyorsanız kullanın _BIN2. Arasındaki farklılıklarla ilgili ayrıntılar için _BINve _BIN2: lütfen bkz Çeşitli İkili Harmanlamalar Arasındaki Farklar (Kültürler, Sürümler ve BIN BIN2 vs) .
    • _UTF8SQL Server 2019'dan itibaren yeni bir seçenektir. Unicode verilerinin depolanmasına VARCHARve CHARveri türlerine (ancak kullanımdan kaldırılmış TEXTveri türüne değil ) izin veren 8 bitlik bir kodlamadır . Bu seçenek yalnızca tamamlayıcı karakterleri destekleyen harmanlamalarda kullanılabilir (yani _SCadlarında sürüm 90 veya 100 harmanlama ve sürüm 140 harmanlama). Ayrıca tek bir ikili _UTF8harmanlama vardır ( _BIN2değil _BIN).

      LÜTFEN DİKKAT: UTF-8, 8 bit kodlamalar için ayarlanmış ancak Unicode'u desteklemek isteyen ortamlar / kodlarla uyumluluk için tasarlanmıştır / yaratılmıştır. UTF-8'in kıyasla% 50'ye kadar yer tasarrufu sağlayabildiği birkaç senaryo olsa da NVARCHAR, bu bir yan etkidir ve birçok / çoğu operasyonda performansa hafif bir vurma maliyeti vardır. Uyumluluk için buna ihtiyacınız varsa, maliyet kabul edilebilir. Yerden tasarruf için bunu istiyorsanız, daha iyi bir test yaptınız ve TEKRAR DENEYİNİZ. Test, tüm işlevleri ve sadece birkaç veri satırından fazlasını içerir. UTF-8 harmanlamalarının TÜM sütunlar ve veritabanının kendisi kullanıldığında en iyi şekilde çalıştığı konusunda uyarılmalıdırVARCHAR veri (sütunlar, değişkenler, dize değişmezleri)_UTF8harmanlama. Bu, bunu uyumluluk için kullanan herkes için doğal durumdur, ancak yerden tasarruf için kullanmayı umanlar için değil. Garip davranış / veri kaybı yaşayabileceğiniz için, VARCHAR verilerini harmanlama veya veri kullanmayan verilerle bir _UTF8harmanlama kullanarak karıştırırken dikkatli olun . Yeni UTF-8 harmanlamaları hakkında daha fazla bilgi için lütfen bkz: SQL Server 2019'da Yerel UTF-8 Desteği: Kurtarıcı mı yoksa Sahte Peygamber?VARCHAR_UTF8NVARCHAR


5
Bunu çok fazla bilgi ve çaba içerdiğinden dolayı vekalet ettim, Cevabım kesinlikle yanlış değil (veritabanları veri depolar, veritabanı sunucuları bu veriler üzerinde hareket eder, sıralama hareket eder). Tam matematiksel kesinlik üzerine kısalık seçtim çünkü OP muhtemelen tüm olası bilgileri değil, yeterli bilgiyi arıyordu.
Kris

4
Merhaba @Kris. Teşekkürler. Adil olmak gerekirse, cevabınızın tamamen yanlış olduğunu söylemedim, sadece kederli bir şekilde eksik. Bunu umarım netleştirmek için güncelledim. Ne dediğini anlıyorum, ama OP COLLATEhükmünün ne yaptığını sordu CREATE DATABASE. Yaptığı birkaç şeyden birini söylediniz. Neden OP'nin cevabın sadece% 10'unu bilmek istediğini düşünüyorsunuz? Tüm bilgiler sunulursa, her biri ne kadar alacağına karar verebilir. Ancak sadece bazı bilgiler verilirse, onlar için seçim yapıldı. Mümkün olduğunca fazla bilgi vermeyi tercih ediyorum çünkü çoğu bilinmiyor. (devam ediyor)
Solomon Rutzky

5
Ne demek istediğini anlıyorum ama çok fazla değil, yeterli bilgi vermeyi hedefliyorum. çok fazla bilgi hızla birçok insan için çok karmaşık hale gelir. ve herhangi bir durum için yeterli bilgi vermediğimde takip soruları beklerim. (Ayrıca konuya bu kadar dikkat edilmesini beklemiyordum)
Kris

8
@Kris Bir süredir "Teşekkürler!" böyle bir olgunluk ve profesyonellik göstermek için. Birilerine yanlış olduklarını söyleyen ve daha sonra etkileşime girmenin "zor" (veya daha da zor) hale geldiğini söyleyen kişilere alışkınım. Ancak, "kabul edilen cevap YANLIŞ " olarak ölçtüğünüz yanıt, intro'yu tonlamam için bana ilham verdi ve burada düzgün ve verimli iletişim kurma konusunda başkalarına örnek olmalı 😺.
Solomon Rutzky

4
Bir şekilde olumlu bir etki yarattığımı duymak hoş ve güzel, ama "yanlış" olmaktan hoşlanıyorum, yeni şeyler öğrenmek için fırsatlar yaratıyor, bu harika!
Kris

24

CP1 'Kod Sayfası 1' anlamına gelir - teknik olarak bu kod sayfası 1252'ye çevrilir


16

HARMANLA Eğer dize değerleri için kullandığınız tür karakter kümesi ve kurallar (sırayla, yüzleşme kuralları) ne belirttiğiniz anahtar kelime.

Örneğin sizin durumunuzda, büyük / küçük harfe duyarlı olmayan ( CI ) ve aksan duyarlı ( AS ) Latin kuralları kullanıyorsunuz

Bu Belgelere başvurabilirsiniz


9

Bu, veritabanı için varsayılan harmanlamayı belirtir. Veritabanındaki tablolarda oluşturduğunuz her metin alanı, farklı bir alan belirtmediğiniz sürece bu harmanlamayı kullanır.

Bir veritabanı her zaman varsayılan bir harmanlama içerir. Hiçbirini belirtmezseniz, SQL Server örneğinin varsayılan harmanlaması kullanılır.

Kullandığınız harmanın adı, Latin1 kod sayfa 1'i kullandığını, büyük / küçük harf duyarsız (CI) ve aksan duyarlı (AS) olduğunu gösterir. Bu harmanlama ABD'de kullanılır, bu nedenle ABD'de kullanılan sıralama kurallarını içerecektir.

Harmanlama, metin değerlerinin eşitlik ve benzerlik açısından nasıl karşılaştırıldığına ve sıralama sırasında bunların nasıl karşılaştırıldığına karar verir. Kod sayfası, uncharde alanları gibi unicode olmayan verileri depolarken kullanılır.


yanlış ( notvarsayılanı kabul edebilmenize rağmen bir harmanlama belirtemezsiniz) yanlış (unicode veriler için de kullanılır)
RichardTheKiwi

@Richard aka cyberkiwi: belgelerini kontrol: msdn.microsoft.com/en-us/library/ms176061.aspx Belirtme harmanlama olduğunu opsiyonel. Kod sayfası , 8 bit kod sayfası dizini olarak değil, 16 bit Unicode kod noktası olarak depolandığından Unicode verilerini depolamak için kullanılmaz.
Guffa

Cevabınızı yanlış okudum, ama yine de yanlış. Bir veritabanı her zaman varsayılan bir harmanlama = SUNUCU harmanlama özelliğine sahip değildir Latin1_General_CI_AS. Şimdi yanlış okudum çünkü ifadenin yarısı , kullanıcı arayüzünde varsayılan kabulü gerektiren SERVER harmanlamasıyla ilgili . 2 noktadan için, görünüyor ima o harmanlama edilir değil (eğer geçiş rağmen unicode veri sıralamak için kullanılan sortingiçin storingson 2 cümleyle). Unicode metin verileri de harmanlamalara uyar.
RichardTheKiwi

@Richard aka cyberkiwi: Varsayılan harmanlama hakkındaki paragrafı, bağlandığım belirli belgelere karşılık gelecek şekilde değiştirdim. (Sunucunun sürümüne bağlı olarak değişir.) İkinci nokta ile ilgili olarak, onu nasıl daha net hale getirebileceğimi göremiyorum. Metin, kod sayfasının unicode olmayan verileri depolarken kullanıldığını söylüyor . Kod sayfası, ne unicode veriler ne de unicode olmayan veriler için sıralamayı belirlemek amacıyla kullanılmaz.
Guffa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.