Sütun harmanlamalarını tek bir veritabanında karıştırmak neden kötü olarak değerlendiriliyor?


11

Bu soruyu sormamı isteyen iki neden var:

tSQLt
T-SQL test çerçevesi tSQLt, varsayılan olmayan bir harmanlama içeren sütunlar olduğunda "Yüksek Önem Derecesi" sorunu olarak değerlendirir . Testin yazarı şunları belirtir:

Her dize sütunu, veritabanı için varsayılan harmanlama ile eşleşen bir harmanlama olması gerektiğini düşündürmüyorum. Bunun yerine, farklı olduğunda bunun iyi bir nedeni olduğunu öneriyorum.

Ancak, başarısız testin şiddeti, belirtildiği gibi, yüksek kabul edilir.

Octopus Deploy
Octopus Deploy Sunucusunu yapılandırırken, OctopusServer örneğinin başlatılması sırasında kurulum bir FATAL hatasıyla başarısız olur. Makale bu sadece bir gerekliliktir, ama neden açıklamıyor hatasız iletisiyle ilgili ondan ve Ahtapot sürüm 3.8 dahil gelecekteki dağıtımlar için bir gereklilik olacağını belirtiyor.

Bir yan not olarak, RedGate'in CI aracı paketi, DLM Automation Suite , şikayeti olmayan çeşitli harmanlamalara sahip dağıtımları destekler.

Tüm sütun harmanlamalarını veritabanında varsayılan olarak tutma önerisi bana daha çok yönergeler veya en iyi uygulamalar gibi görünüyor. Neden bazıları tarafından bu kadar ciddi bir hata olarak kabul edilir?


SQL Cop testlerinin tSQLt enkarnasyonlarına atıfta bulunuyorsunuz. TSQLt testleri başarılı veya başarısız olduğu için, bunların önerilen bir varsayılan değeri sunması gerekir. TSQLt çerçevesi tarafından alınan SQLCop şemasındaki saklı yordamlardan daha fazla olmadığı için, kullanıcıların SQLCop testlerini kendi gereksinimlerine uyarlamaları beklenir.
David Atkinson

Yanıtlar:


19

Tüm sütun harmanlamalarını veritabanında varsayılan olarak tutma önerisi bana daha çok yönergeler veya en iyi uygulamalar gibi görünüyor.

Burada tamamen haklısın.

Neden bazıları tarafından bu kadar ciddi bir hata olarak kabul edilir?

Aynı nedenle sık sık " asla kullanmamalısınız " ifadesini duyarsınız / okursunuz.

  • imleçleri
  • GOTO ifadeleri
  • SQLCLR
  • WITH (NOLOCK)
  • vs, vs, vs

Bazı özellikler / seçenekler / teknolojiler diğerlerinden daha karmaşıktır ve genellikle kullanıcı tarafından daha fazla bilgi gerektirir, çünkü kullanırken sorun yaşama şansı, herhangi bir sorun yaşama şansından çok daha yüksektir. Dolayısıyla, genel nüfus için bu tür şeylere karşı genel kurallara sahip olmak daha kolaydır. Aslında, "Kodlama Standartları" nı iş yerinde yazarken, aslaCURSOR'ları kullanıyorum, fakat onları kendim kullanıyorum çünkü hem "ne zaman" kullanacağımı hem de onları etkili bir şekilde nasıl kullanacağımı biliyorum. Ancak yalnızca ara sıra sorgu yazan kişilerden bunu bilmeleri beklenmemelidir. Bu aynı zamanda, "ne yaptığınızı kesinlikle bilmediğiniz sürece Kayıt Defterini düzenlemeyin" veya (çok küçük) çocuklarımız için ebeveyn olarak yaptığımız kurallara benzer. belirli bir şeyi yapmanın ne zaman uygun olduğu ya da nasıl yapılacağı konusunda karmaşıklıkları aşamayan.

Harmanlama durumunda, bu çok karmaşık ve kafa karıştırıcı bir konudur ve her iki sabit hata ile de karşılaşabilirsiniz (bunlar bir sorundur, ancak açık ve dolayısıyla düzeltilmesi yeterince kolay olduğundan) daha az sorun olabilir. bir şeyin neden olduğu gibi davrandığını açıklamanın zor olduğu davranışlar (bazı öğeler neden beklentilerin dışında filtrelenir veya filtrelenmez VEYA sıralama neden beklentilerin dışında hareket eder). Ve ne yazık ki, etrafında toplu karışıklık yaratan oldukça büyük miktarda yanlış bilgi var gibi görünüyor. Aslında Harmanlama ve kodlamalar, vb genel bilgi büyük ölçüde artırmak için bir proje üzerinde çalışıyorum ve umarım yanlış bilgi ve mitleri karşı koymak, ama henüz yayınlamak için hazır değil (bittiğinde bunu bir bağlantı ile güncelleyeceğim).

Harmanlama için, iş durumu için en anlamlı olanı kullanmanız gerekir. Harmanlamaları bir tablo veya veritabanında karıştırmama kavramı varsayılan bir yaklaşımdır, ancak sistem kataloğu görünümlerinin çeşitli sütunları için kullanılan Harmanlamalara bakarsanız, çeşitli Harmanlamaların kullanıldığını göreceksiniz. Bu yüzden, Harmanlamalar farklı olacaksa, kasıtlı olmalı, ancak doğal olarak yanlış olan hiçbir şey olmadığı sorusundaki ana alıntıya katılıyorum.


Soruyla ilgili olarak (vurgu eklendi):

Octopus Deploy Sunucusu yapılandırılırken, OctopusServer örneğinin başlatılması sırasında kurulum bir FATAL hatasıyla başarısız olur. Hata iletisiyle ilgili makale bunun neden bir gereklilik olduğunu açıklamıyor

Bağlantılı dokümantasyon sayfasını kontrol ettim ve bunun neden bir gereklilik olduğunu açıklıyor. İlgili bilgileri aşağıdaki belgelerden kopyaladım:

Ahtapot Veritabanındaki tüm nesnelerin harmanlamasını da değiştirdiğinizden emin olmalısınız, aksi takdirde Ahtapot sürüm yükseltmeleri sırasında veritabanını değiştirirken hatalar oluşabilir. Oluşturulan yeni nesneler güncellenmiş harmanlamayı kullanır ve orijinal harmanlamayı kullanarak bunlar ve mevcut nesneler arasında SQL birleşimleri yapmaya çalışırken (örneğin) harmanlama yanlış eşleşme hataları oluşabilir.

Ahtapot veritabanındaki kodlarının dize sütunları arasında JOIN'leri olduğunu ve gelecekteki bir yükseltmede yeni dize sütunlarında ek JOIN'ler bulunan yeni bir kodun eklenebileceğini söylüyorlar . CREATE TABLEVeya yoluyla yeni sütunlara, ALTER TABLE ... ADDveritabanının varsayılan Harmanlaması atanırsa,COLLATEyeni dize sütun (lar) ı için anahtar kelime belirtilmedi. Ve aynı harmanlama içermeyen dize sütunları arasında JOINs bir harmanlama uyuşmazlığı hatası oluşturur. Ayrıca, kullanıcının kendi Harmanlamasını seçmesine izin veriyor gibi görünüyorlar (muhtemelen farklı yerel ayarları barındırmak için) çünkü üstte tek gereklilik Harmanlama'nın büyük / küçük harfe duyarsız olduğunu söylüyorlar. Ve kodlarının içinde bulunduğu veritabanının Harmanlanması her zaman aynı olacağından emin olmadığı için COLLATE, aynı Harmanlamayı tüm yeni dize sütunlarında zorlamak için kullanamazlar (teknik olarak yapabilirler, ancak bu Dinamik gerektirir) SQL, güncelleme komut dosyaları oluştururken uğraşmak o kadar kolay değildir). Kullandıkları mümkün olsaydı COLLATEanahtar kelime, o zaman olabilirVeritabanı varsayılan harmanlama dize sütunlarından farklı olması ile kurtulmak. Bu zor "Harmanlama uyuşmazlığı" hatalarını önleyecektir, ancak yine de bu dize sütunlarından birini ve bir dize değişmez veya değişkenini içeren karşılaştırma işlemleri olasılığını açık bırakacaktı. Harmanlama. Tabii ki, bu beklenen davranış çok iyi olabilir. Ancak bu bir üçüncü taraf uygulaması olduğundan, davranış, a) kullanıcının istediği (veya itiraz etmediği) ve b) kullanıcının bir hatayı düşündüğü (ve sonra) arasındaki 50/50 şans yerine amaçladıkları şey olmalıdır. satıcının vahşi kaz kovalamaca ve / veya yazılımlarının nasıl buggy olduğu ile ilgili bloglarda destek süresini boşa harcar).


Hey, o proje hakkında Harmanlama ile ilgili bir haber var mı?
Yaroslav

10

Kısa bir cümleyle: COLLATION , sıralama ve karşılaştırmayı tanımlar .

Bu nedenle, harmanlama , SQL Server'ın karakter verilerini karşılaştırmak ve sıralamak için kullandığı kuralları belirler. Bu kurallar dil / yerel ayar farkındadır ve ayrıca büyük / küçük harf, aksan, Kana ve genişliğe duyarlı olabilir. Harmanlama sonekleri sözlük kuralı (inç) duyarlılığını tanımlar: _CS (büyük / küçük harfe duyarlı), _CI (büyük / küçük harf duyarlı), _AS (aksan duyarlı), _AI (aksan duyarlı) ve _KS (Kana duyarlı). _BIN (ikili) ve _BIN2 (ikili kod noktası) sonekleriyle tanımlanan ikili harmanlamalar her bakımdan hassastır.

Farklı harmanlamalar kesinlikle "harmanlama çatışmasını çözemez" hatalarından kaçınmak için geçici çözümler talep eder ve bilinen anlaşılmaz ifadeler nedeniyle performansı öldürebilir . Farklı harmanlamalarla uğraşmak bir kabus olabilir (orada olmuştur), bu yüzden birini seçip ona bağlı kalmanın önerisi budur.

Daha fazla referans:


1

Birçok şeyde olduğu gibi, SQL'in önceki sürümlerinde oldukça önemli sorunlara neden olabilir. SQL7 / 2000'den bu makaleye bakın

SqlServerCentral Harmanlama

Şimdi çok daha sağlam ve daha modern sistemlerde haklı olduğu durumlar var, ancak onu değiştirmek için hala oldukça ilginç uyarılar var.

İşte daha modern versiyonlarda bir başka faydalı seri. Ben yakında düzenli olarak burada yayınlar inanıyorum kim Guzman tarafından, o yakında boru olabilir :)

SQL Harmanlama Cehennemi

Kısacası, uyumluluk, standardizasyon ve potansiyel performans isabetleri, karışık harmanlamanın kullanılmamasının ana nedenleridir.


0

Harmanlamalar arasında veri aktarımı, nchar (16 bit) yerine char (8 bit metin) ise verileri değiştirebilir.

Bu sayfadan https://the.agilesql.club/blogs/Blogs/Ed-Elliott/What-collation-variables-take-on-inT-SQL değişkeninin bir tablodan metin atandığında, örtük olarak geçerli veritabanının harmanlanması olarak kabul edilir. Ancak farklı bir veritabanına geçtiğinizde değişken içindeki metne ne olur? Bu baytlar (gerekirse) yeni harmanlamaya tekrar çevriliyor mu?

"Latin" harf aksanlarını kaldırmak ve yalnızca ASCII metnini bırakmak için bir harmanlama hilesi aldım, çünkü üçüncü taraf yazılımımız aksanlarda boğuluyordu - metni sadece ASCII ve modern Yunan alfabesini içeren bir harmanlamaya koydum; Collate SQL_Latin1_General_CP1253_CI_AI. Roma harfleri üzerine aksanlara "Slán"! ;-)

Ama kötü haber onları tutmak isteseydim!

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.