SQL Server Collation Değişikliği

SQL Server Collation Değişikliği SQL Server’da “Collation” terimini zaten duymuş olmalısınız. Collation, karakter verileri sıralamasının nasıl yapıldığını belirleyen bir yapılandırmadır. Bu, SQL Server veritabanı servisi karakter verileriyle çalışırken nasıl davranacağı üzerinde büyük etkisi olan önemli bir ayardır. Bu yazıda, genel olarak Collation’ları tartışmayı ve Collation ile ilgili birkaç örnek gösterelim. Collation’ları nerede bulabilirim? SQL Server…

April 14, 2021 by Aryasoft IT

SQL Server Collation Değişikliği

SQL Server’da “Collation” terimini zaten duymuş olmalısınız. Collation, karakter verileri sıralamasının nasıl yapıldığını belirleyen bir yapılandırmadır. Bu, SQL Server veritabanı servisi karakter verileriyle çalışırken nasıl davranacağı üzerinde büyük etkisi olan önemli bir ayardır. Bu yazıda, genel olarak Collation’ları tartışmayı ve Collation ile ilgili birkaç örnek gösterelim.

Collation’ları nerede bulabilirim?

SQL Server Collation, veritabanı ve sütun düzeyinde bulabilirsiniz. Bilinmesi gereken bir diğer önemli şey de Collation ayarının sunucu, veritabanı ve sütun düzeyinde aynı olması gerekmediğidir. Ayrıca, belirli Collation ‘ları kullanmak için sorgularınızı güncelleyebilirsiniz. Collation tutarlı değilse beklenmeyen sorunların ortaya çıkma olasılığı yüksek olduğundan, ortamınızda doğru Collation yapılandırmanın önemini işte bu noktada anlayacaksınız.

Belli Collation Türlerini Açıklayalım;

CS — büyük/küçük harfe duyarlı
AI — aksana duyarsız
KS — kana türüne duyarlı
WS — genişliğe duyarlı
SC — ek karakterler
UTF8 — Kodlama standardı

SQL Server, kullanılabilir Collation’ ların tam listesini almak için aşağıdaki sorguyu çalıştıralım.

 SELECT * FROM sys.fn_helpcollations();

Collation Seviyeleri

SQL Server üzerinde dört seviyede collation ayarı tutulabilmektedir. Bu seviyeler;

  • Sunucu seviyesinde
  • Veri tabanı seviyesinde
  • Kolon seviyesinde
  • Sorgu seviyesinde

Sunucu Seviyesinde

SQL Server kurulumu sırasında seçilir ve diğer bütün veri tabanı ve kullanıcıların varsayılan collation ayarı olur.

Kurulumdan sonra bu ayar değiştirilmek istenirse öncelikle bütün veri tabanlarının nesneleri ve verilerini dışarı aktardıktan sonra master veri tabanının rebuild işlemine tabi tutulması gerekmektedir. master veri tabanı rebuild edildikten sonra veri tabanları ve veriler tekrardan içeri aktarılır. Bütün bir sunucu seviyesinde collation ayarını değiştirmek yerine veri tabanı oluştururken veri tabanı seviyesinde de collation ayarı seçilebilir.

>>> SELECT CONVERT(varchar, SERVERPROPERTY(‘collation’));

Yukarda verdiğimiz kod ile sunucunun mevcut collation ayarı sorgulanabilir.

Veri Tabanı Seviyesinde Collation

Veri tabanı oluşturulurken seçilir. Veri tabanı oluşturma sırasında seçilmezse varsayılan olarak sunucu seviyesinde seçilen collation seçilir. Veri tabanı oluşturulma veya değiştirilme işlemlerinde COLLATE komutu ile seçilebilir.

Sunucu seviyeside colletion değiştirilmeden sistem veri tabanlarına ait colletion ayararı değiştirilemez.

Veri tabanı colletion ayarı, veri tabanına ait bütün bilgilerde geçerli olur. Bir veri tabanına ait colletion ayarı değiştirildiğinde geçici tablolarla çalışan sorgularında hata alınabilmektedir. Alınan bu hatanın sebebi, geçici tabloların tempbd veri tabanında tutulmasında dolayıdır. Bu tür alınabilecek hataların önüne geçmek için COLLATE komutu ile sorgu düzeyinde colletion ayarı yapılmalıdır.

Veri tabanı oluşturulurken colletion ayarının belirtilmesi ve oluşturulan veri tabanına ait bilgilerin sorgulanması;

USE master;

GO

CREATE DATABASE TestDb

COLLATE Latin1_General_100_CS_AS_SC;

GO

–Var olan Veri tabanı bilgilerinin alınması.

SELECT name, collation_name

FROM sys.databases

WHERE name = N’TestDb’;

GO

Aşağıdaki örnek kodda olduğu gibi veri tabanına ait colletion ayarı değiştirilebilir. Veri tabanı seviyesinde yapılan colletion ayar değişikliği kolon seviyesinde yapılmış olan ayarları etkilememektedir.

ALTER DATABASE myDB COLLATE Spanish_CS_AI;

Aşağıdaki kod ile de belli bir veri tabanına ait colletion ayarına ulaşılabilir.

SELECT CONVERT (VARCHAR(50), DATABASEPROPERTYEX(‘database_name’,’collation’));

Kolon Seviyesinde Colletion Ayarı

Tablo oluşturulurken COLLATE komutu ile her bir kolonun colletion’ı  ayrı ayrı olarak ayarlanabilir, herhangi bir colletion ayarı yoksa  veri tabanına ait colletion varsayılan olarak seçilir.

ALTER TABLE ile mevcutta olan kolonların ayarları değiştirilebilir.

ALTER TABLE table ALTER COLUMN kolonAd NVARCHAR(10) COLLATE Spanish_CS_AI;

Sorgu Bazlı Colletion Ayarı

Sorgu bazlı colletion ayarında sorgu çalışma zamanında COLLATE komutu ile ayarlanır. Özellikle ORDER BY işlemlerinde kullanılır.

SELECT isim FROM urunler ORDER BY name COLLATE Latin1_General_CS_AI;

Collation Çakışmaları

SQL Server, birkaç Collation için destek sağlar. Ancak Collation uyuşmazlıklarını işleyemez. Farklı Collation sahip alanları karşılaştırmaya çalıştığımızda, SQL Server Collation adlarıyla ilgili bir hata atar. İşte hata mesajı:

Benzer işlemde “Latin1_General_CI_AI” and “SQL_Latin1_General_CP1_CI_AS”

Arasındaki Collation çakışması çözülemiyor.

Bu çakışmaları önlemek istiyorsak, SQL ifadesine varsayılan bir collation eklememiz gerekir.

COLLATE DATABASE_DEFAULT

WHERE Column1 COLLATE DATABASE_DEFAULT = Column2

Bu sorun, SQL Server için programlama yaparken sorunlara neden olabilir. Yukarıda açıklandığı gibi, COLLATE yan tümcesini bir SQL Server sütun karşılaştırma yan tümcesiyle kullanarak bu sorunu çözebiliriz. SQL Server ilk kez kurulduğunda ve yanlış colletion seçeneği bulunduğunda, tempdb kullanımıyla ilgili sorunlara neden olabilir. SQL Server hizmeti yeniden başlatıldığında, varsayılan sunucu düzeyinde colletion ile tempdb oluşturulur.

Size ve Veritabanlarınıza Yardımcı Olmak İçin Bekliyoruz!