Veritabanı Collation Değişikliği: Neden Bu Kadar Riskli?
I’m a passionate software engineer specializing in SQL change management, database security, and DevOps automation. With over 17 years of experience in the banking sector, I focus on building tools and processes that make database deployments safer, more auditable, and automated.
As the creator of SQL Change Guard, I develop solutions that use risk scoring and AI-powered code analysis to detect dangerous SQL scripts before they reach production. I’m dedicated to helping teams minimize downtime and data loss through smarter change governance.
When I’m not coding, I enjoy sharing insights about secure development practices, WPF desktop applications, and integrating modern CI/CD pipelines.
Feel free to connect or reach out at info@sqlchangeguard.com
Collation, veritabanındaki karakter karşılaştırma ve sıralama kurallarını belirler. Yanlış ayarlanmış collation yıllarca sorun yaratır. Değiştirilmesi ise çok daha büyük sorun.
Collation Neden Önemli? Collation üç şeyi etkiler: büyük/küçük harf duyarlılığı, aksan duyarlılığı ve karakter sıralama düzeni. SQL_Latin1_General_CP1_CI_AS ile Turkish_CI_AS arasındaki fark küçük görünür. Ama Türkçe karakterler içeren veritabanlarında yanlış collation şu sonuçlara yol açar:
"istanbul" ile "İstanbul" eşit sayılmayabilir ORDER BY sıralaması beklenmedik sonuç verir JOIN işlemleri karakter farklılığı nedeniyle başarısız olabilir Full-text search yanlış sonuçlar döndürür
Collation Mevcut Durumu İnceleme sql-- Sunucu collation SELECT SERVERPROPERTY('Collation') AS SunucuCollation;
-- Veritabanı collation SELECT name AS VeritabaniAdi, collation_name AS Collation FROM sys.databases ORDER BY name;
-- Kolon bazında farklı collation kullananlar SELECT t.name AS TabloAdi, c.name AS KolonAdi, c.collation_name AS KolonCollation, DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS VeritabaniCollation FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id WHERE c.collation_name IS NOT NULL AND c.collation_name != CAST(DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS NVARCHAR(128)) ORDER BY t.name, c.name; Son sorgu veritabanı varsayılanından farklı collation kullanan kolonları listeler. Bu kolonlar potansiyel uyumsuzluk noktaları.
Collation Değiştirmenin Zorlukları Veritabanı collation değiştirme Veritabanı collation'ını değiştirmek mevcut verileri otomatik dönüştürmez. Sadece yeni oluşturulacak nesnelerin varsayılan collation'ını belirler. Mevcut char, varchar, nvarchar kolonlarının collation'ını değiştirmek için her kolonu ayrı ayrı ALTER TABLE ile güncellemek gerekir. sql-- Tek kolon için collation değiştirme örneği ALTER TABLE dbo.Musteriler ALTER COLUMN Sehir NVARCHAR(100) COLLATE Turkish_CI_AS NOT NULL; Ama bu işlem büyük tablolarda çok uzun sürer ve kilit sorunlarına yol açar. Sistem nesneleriyle uyumsuzluk Geçici tablolar (#temp) sunucu collation'ını kullanır. Veritabanı collation'ı farklıysa geçici tablolarla JOIN yapmak collation uyumsuzluk hatası verebilir.
Collation Değişikliği Neden Değişiklik Yönetiminin En Riskli Konularından Biri? Geri alınması son derece zor: Collation değiştirildikten sonra geri almak neredeyse yeni bir migration yapmak kadar karmaşık. Etki alanı çok geniş: Tüm string kolonlar, tüm sorgular, tüm JOIN işlemleri etkilenebilir. Test edilmesi zor: Test ortamında sorun çıkmayabilir, asıl sorunlar production verisinin çeşitliliğiyle ortaya çıkar.
Collation Değişikliği İçin Minimum Gereksinimler Bu değişiklik yüksek risk kategorisinde değerlendirilmeli ve şunlar zorunlu olmalı: Tüm etkilenen kolonların listesi. Her kolon için dönüşüm ve geri alma script'i. Test ortamında production verisiyle test sonuçları. Uygulama katmanı testi. Onay için teknik ekip ve uygulama geliştiricilerinin birlikte imzası.
Sonuç Collation değişikliği veritabanı değişikliklerinin en karmaşık ve en riskli kategorilerinden biri. "Küçük bir ayar değişikliği" gibi görünse de etkisi tüm sisteme yayılabilir. Bu değişiklik asla hafife alınmamalı. Detaylı bilgi için: sqlchangeguard.com
