
Aynı tabloda aynı isimli iki kolon yaratma işlemine başlamadan önce “collation” nedir sorusunun cevabını verelim.
Collation, SQL Server’ da “character set” anlamına gelmektedir. Eşitliklerde, sıralama işleminde, büyük küçük harf ayrımında karakterlerin hangi mantıkta kullanılacağını belirler. Genelde Türkçe veritabanlarında kullanılan Turkish_CI_AS ya da SQL_Latin1_General_CP1254_CI_AS collation name deki “CI” ifadesi “Case Insensitive (Büyük küçük harf ayrımı olmasın)” anlamına gelmektedir.
Özellikle SQL Server 2000′ de collation name olarak Turkish_CI_AS seçilmekteydi, fakat SQL Server 2005 ve SQL 2008′ e geçiş sonrasında daha çok SQL_Latin1_General_CP1254_CI_AS kullanılmaya başlanmıştır.
Şimdi sevdiklerimizi şaşırtacağımız belki de iddiaya girerek tadelle kazanacağımız kodu anlatalım 🙂
Öncelikle SQL Management Studio yeni sorgu ekranımızda sevdiğimiz yazılımcıları şaşırtacağımız sürpriz isimli yeni bir veri tabanı yaratalım.
CRATE DATABASE SURPRISE
Daha sonra yaratmış olduğumuz veri tabanı içinde sütun isimleri aynı olan bir tablo yaratmaya çalışalım.
CREATE TABLE [dbo].[COLLATION_TEST](
[ID] [int] IDENTITY(1,1) NOT NULL,
[WAIT_TIME] [int] NULL,
[wait_time] [int] NULL,
[SPIDERMAN] [bit] NULL,
[spiderman] [bit] NULL,
CONSTRAINT [PK_COLLATIONTIME] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
Komutu çalıştırdığınızda “Column names in each table must be unique. Column name ‘wait_time’ in table ‘COLLATION_TEST’ is specified more than once.” şeklinde bir hata alacaksınız. Bunun sebebi varsayılan collation ayarının SQL_Latin1_General_CP1_CI_AS olmasıdır. Bu dil seçiminde aynı tablo içinde aynı isimli sütun yaratılmasına izin verilmez. Bu durumu COLLATION kullanarak az da olsa değiştirebiliriz.
- Şimdi sırasıyla aşağıdaki kodları çalıştırarak DB varsayılan dil yapısını değiştirelim. Ve sonrasında tablomuzu yaratalım.
ALTER DATABASE SURPRISE SET SINGLE_USER WITH ROLLBACK IMMEDIATEALTER DATABASE SURPRISE COLLATE Turkish_CI_ASALTER DATABASE SURPRISE SET MULTI_USER
USE [SURPRISE]
GO
CREATE TABLE [dbo].[COLLATION_TEST](
[ID] [int] IDENTITY(1,1) NOT NULL,
[WAIT_TIME] [int] NULL,
[wait_time] [int] NULL,
[SPIDERMAN] [bit] NULL,
[spiderman] [bit] NULL,
CONSTRAINT [PK_COLLATIONTIME] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
Hatasız şekilde Commands completed successfully. mesajımız geldi.
Aslında burada yapılan küçük bir hile Türkçe dilinde büyük I ve küçük i karakterleri ingilizcenin aksine aynı değildir (Iı ve İi).
Peki sadece sütun adında i karakteri olanlar için mi bu sürprizi yapabiliriz:) Hayır daha fazlası için CASE SENSITIVE bir COLLATION SET edebiliriz.
ALTER DATABASE SURPRISE SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE SURPRISE COLLATE SQL_Latin1_General_CP1_CS_AS
ALTER DATABASE SURPRISE SET MULTI_USER
--DROP TABLE COLLATION_TEST
USE [SURPRISE]
GO
CREATE TABLE [dbo].[COLLATION_TEST](
[ID] [int] IDENTITY(1,1) NOT NULL,
[WAIT_TIME] [int] NULL,
[wait_time] [int] NULL,
[SPIDERMAN] [bit] NULL,
[spiderman] [bit] NULL,
[SURPRISE] [varchar] NULL,
[surprise] [varchar] NULL
CONSTRAINT [PK_COLLATIONTIME] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
Tabi şaşırtmak istediğimiz yazılımcı arkadaşların büyük/küçük harf duyarlılığı da önemli 🙂
Umarım işinize yarar.
Kaynak: tanerhacioglu.com
Çok işime yaradı. Elinize sağlık.