SQL Server’de Language ve Collation kavramı

C#, VB.NET, ASP.NET Add comments

Bu makalede SQL Server’da language ve collation kavramlarının farklılıklarından bahseceğiz. Language kavramı, mesajlar, date/time, ay/gün isimleri, para formatı ve birimi gibi yerel bilgileri desteklemekle sınırlıdır. SQL Server, kendi içerisinde birçok dile ait yerel bilgileri taşır. Bu bilgiler, kullanıcıların oturumlarına bağlı olarak uygulamalarda farklı dil değerlerini göstermelerini sağlamaktadır.

SQL Server’in desteklediği dil veya diller hakkında ayrıntılı bilgi almak için sp_helplanguage procedure kullanılabilir. Bu procedure, @language parametresi girilmezse tüm dillerin ayrıntısı listelenir. Language tanımlamaları, sys şemasına bağlı syslanguages tablosunda saklıdır.

--Bütün dilleri listeleyelim.
EXEC sp_helplanguage
--Sadece Türkçe dilinin bilgilerini görelim
EXEC sp_helplanguage turkish
--Doğrudan syslanguages tablosunu sorgulayalım.
SELECT * FROM sys.syslanguages WHERE alias='turkish'

SQL Server’da dil ayarı sunucu ve kullanıcı(oturum) bazında etkili olur. SQL Server’in instanceni kurarken language değerini de set edebiliriz. Sunucunun default dil değerini Sever Properties penceresindeki Advanced sekmesindeki Default Language bölümünden görebilir ve değiştirebiliriz. Programatik olarak T-SQL ile değiştirmek için sp_configure yordamı kullanılır. Bilindiği gibi sunucuyla ilgili yapılandırma bilgileri master veritabanı altındaki sys.sysconfigures tablosunda tutulmaktadır. Bu tablodaki default language değerini okuyarak sunucunun aktif language bilgisine ulaşabiliriz. Bu tabloyu doğrudan update etmek yerine sp_configure yordamını kullanarak sunucunun dilini değiştirebiliriz. Bu yordamı çalıştırdıktan sonra sunucuyu yeniden yapılandırmak için RECONFIGURE ifadesini kullanmalıyız. Bu ifade, stop-restart gerektirmeyen değişiklikleri o anda aktifleştirir.

sp_configure 'default language', 22--turkish yani
reconfigure with override--Aksi durumda SQL restart olduktan sonra aktifleşir

Bağlı olduğumuz kullanıcının, oturumun dilini öğrenmek için @@LANGUAGE isimli global değişkeni kullanılır. Kullanıcının o anki oturumunda geçici olarak dili değiştirmek için SET LANGUAGE kullanılır. SET LANGUAGE { [ N ] ‘language’ | @language_var } Bunu genellikle o anda tarih veya para birimini düzenlemek için kullanırız.

SELECT @@language --us_english döndürdü
--Bu oturumda geçici olarak dili değiştirelim.
SET LANGUAGE turkish
SELECT @@language--Türkçe döndürdü

Yeri gelmişken söyleyelim oturumumuzda tarih formatını değiştirmek için SET DATEFORMAT deyimi de kullanılabilir.SET DATEFORMAT { format | @format_var } Böylece kalıcı değil sadece o oturumda tarih formatını değiştirmiş oluruz.

--Tarih formatını day, month, year olarak düzenleyelim.
SET DATEFORMAT dmy
DECLARE @Tarih DATETIME
SET @Tarih = '31/12/2006'
SELECT @Tarih AS Tarih

Eğer burada DATEFORMAT ile geçici olarak tarih formatını değiştirmeseydik SQL Server, default olarak MM/DD/YY formatını kullandığı için T-SQL’in klasik hatası The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. mesajıyla karşılaşırdık.

Bir kullanıcının kalıcı olarak dil ayarını değiştirmek için sp_defaultlanguage procedure kullanılır.sp_defaultlanguage [ @loginame= ] ‘login’
[ , [ @language= ] ‘language’ ]
Microsoft, SQL Server’in 2005′ten sonraki versiyonlarında bu özelliği kaldıracağını söylemektedir.

EXEC sp_defaultlanguage 'Ayse', 'Turkish'

Buna alternatif olarak ALTER LOGIN ifadesiyle güncellemenin yapılması tavsiye edilir. Nitekim, sp_defaultlanguage yordamı da ALTER LOGIN . . . komut yapısını çalıştırmaktadır.

ALTER LOGIN Ayse WITH DEFAULT_LANGUAGE = Turkish

Bu ifade, Ayse isimli login için default language değerini Türkçe olarak set eder.

Collation, işletim sisteminden bağımsız olup bir dil veya alfabenin karakter kurallarını tanımlar. Örneğin Türkçe dilinde küçük “i” ile büyük “İ”nin aynı olmaması bu dilin collation yapısıyla ilgilidir. Bununla birlikte bir dil, farklı milletler tarafından farklı lehçelerle konuşulabiliyor. Windows, dilleri ve lehçelerini birer 32 bitlik Language ID Reference Number(LCID) koduyla saklar. Bu numaralandırma aynı dilleri veya alfabeleri aynı çatıda toplamak için kullanılan bir yöntemdir.
Collationlar, karakterlerin doğru yazılıp okunması ve karşılaştırılmasından sorumludur.
SQL Server, iki tür collation yapısı sunar;

  • Windows collations
  • SQL collations
    SQL Server collation, Unicode (nchar,nvarchar ve ntext) ve non-Unicode(char,varchar ve text) veri türlerinin sıralaması ve karşılaştırılmasında önemli rol oynar. SQL server’da collation tanımları 4 bölümden oluşur;
  • Sıralama Kuralları – Dil veya alfabe adı.
  • Üstünlük - Büyük küçük karakter önceliği(seçimli)
  • CodePage - ASCII code page(seçimli)
  • CaseSensitivity + AccentSensitivity veya BIN - Aksan veya binary kodCaseSensitivity CI (case insensitive) veya CS (case sensitive) değerlerini alabilir

    AccentSensitivity AI (accent insensitive) veya AS (accent sensitive) olabilir.

    BIN ifadesi, text sıralama yerine binary sort algoritmasına göre sıralamanın yapılacağını bildirir.

    Örneğin SQL_Latin1_General_Pref_CP437_CI_AS ifadesi Latin1_General(alphabet), Pref(Uppercase önceliği), CP437(437 nolu code page), CI(Case Insensitive) ve AS(Accent Sensitive) özelliklerinin kullanılacağı anlamına gelir. Aynı şekilde Türkçe databaseler için kullanılabilecek SQL_Latin1_General_CP1254_CI_AS ifadesi de Latin alfabesinde 1254 Page Code’un(256 karakter ki Türkçe bu aileye dahildir) Case Insensitive ve Accent Sensitive özellikleriyle kullanılacağı anlamına gelmektedir.
    Buşekilde SQL Server collationlar aşağıdaki suffixlerle tanımlanmıştır.

  • _BIN (Binary)
  • _CI/_CS (Case Sensitivity)
  • _AI/_AS(Accent Sensitivity)
  • _KS(Kana character Sensitivity, Japonca kana karakter seti) (hiragana/katakana)
  • _WS(Width Sensitivity)(full[double-byte character]/half width[single-byte character]) SQL Server’da iki kaydın sıralama veya karşılaştırılmasında 5 ihtimal vardır.
  • Ascending or descending? (is ‘a’>‘b’?)
  • Case-sensitive? (is ‘a’>‘A’?)
  • Accent-sensitive? (is ‘a’=‘á’?)
  • Character width? (is ‘a’>‘aa’?)
  • Kana character types? (is ‘?’=‘?’?)SQL Server’daki collation ad ve açıklamalarına erişmek için fn_helpcollations fonksiyonu kullanılabilir.
    SELECT * FROM fn_helpcollations()

    SQL Server’da collation ayarları,

  • Server
  • Database
  • Column
  • Expression bazında gerçekleştirilebilir.
    Server bazında collation ayarlaması, oluşturulacak databaseleri etkiler ve onların default collation değeri olmuş olur. SQL Server, ilk kurulduğunda Windows’un yerel ayarlarına(Regional and Language Options) uygun collation değerini set eder. Serverin collation bilgisi, Management Studio’da Object Explorer penceresinde ilgili serverin Database Engine’nine sağ tıklayıp properties bölümünden General sekmesindeki Server Collation bölümünden görülebilir. Ayrıca SERVERPROPERTY fonksiyonuna collation parametresi gönderilerek te öğrenilebilir.

    SELECT SERVERPROPERTY('collation')

    Bu query, benim makinemde Turkish_CI_AS değerini döndürdü. Makinemizdeki SQL Server instance’in hangi karakter sıralaması(sort order) ve karakter seti(character set) kullandığını öğrenmenin daha açık yolu sp_helpsort procedureni kullanmaktır. Bu procedure, benim makinem için Turkish, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive değerini döndürdü.Server’in collation bilgisi, ../Tools/BINN klasörü altındaki RebuildM.exe aracıyla değiştirilebilir.

    Database seviyesinde collation tanımlaması yapılabilir. Bütün databaseler default olarak server collation olmak üzere bir collation değerine sahiptir. Management Studio ortamında yeni bir database oluşturduğumuzda Options sekmesinde Collation bölümünden seçim yapılabilir veya olarak bırakılabilir. Veya T-SQL yardımıyla database oluşturulurken COLLATE sözcüğüyle collation değeri girilebilir.

    CREATE DATABASE FrDatabase COLLATE French_CI_AI

    Sunucu üzerindeki databaselerin collation değerlerini görmek için sys.databases tablosu sorgulanabilir veya

    --Sistemdeki databaselerin collation bilgilerini listeyelim
    SELECT name, collation_name FROM sys.databases

    Veritabanındaki nesne sorgulamalarında collation değeri rol oynadığı için Turkish_CI_AS değerine sahip bir databasede Musteri isimli bir tablomuz olsun. Bunu hem Musteri hem de Musterİ olarak çağırabiliriz. Çünkü bu collation, Türkçe dilinin büyük-küçük karektere duyarlı olmayan şeklini temsil etmektedir, Türkçe’de küçük “i” ile büyük “İ” birbirine eşit olduğu için tablo ismi sorun çıkarmamaktadır. Bu tabloyu MusterI diye büyük “ı” ile çağıramayız bu şekilde çağırmak için collation tipinin İngilizce(SQL_Latin1_General_CP1_CI_AS) olması gerekmektedir. SQL Server’da bir database’in Collation değerlerini değiştirmek için o database’i single user moda getirip ALTER DATABASE . . . ifadesi kullanılır.

    Veritabanı üzerinde oluşturulmuş tablo kolonları seviyesinde de collation tanımlaması yapılır. Aynı şekilde yukarıda bahsettiğimiz veri türündeki kolon için özel bir collation tanımlaması yapılmazsa database için geçerli collation değerini override edilir. Management Studio’da Table Designer bölümünden kolonun collation değer set edilir. Aynı şekilde CREATE TABLE aşamasında da bu değer set edilebilir.

    CREATE TABLE [dbo].[OGRENCI](
    	[AdSoyad] [char](10) COLLATE Turkish_CI_AS NULL
    ) ON [PRIMARY]

    Sanırım en ilginç yanı SQL Server’da özellikle koşul ve sıralama esnasında deyimler seviyesinde de collation değeri girebiliyor olmamızdır. Bunu sorgulamalarda yine aynı şekilde COLLATE ifadesiyle sağlıyoruz. COLLATE [Windows_Collation_name|SQL_Collation_Name] Yukarıda bahsettiğimiz tablo ismindeki büyük-küçük harf duyarlılığı tablo içerisindeki veriler için de geçerlidir. Örneğin ACicekci şeklinde bir kayıt için sorgulamalarda hem ACicekci hem de ACICEKCI durumunda gelinmesi isteniyorsa aşağıdaki gibi bir sorgulama yapmamız gerekir. UYE isimli tablonun UserNameEng ve UserNameTr isimli kolonları bulunsun. UserNameEng kolonunun collation değeri SQL_Latin1_General_CP1_CI_AS UserNameTr kolonunun collation değeri de Turkish_CI_AS olsun. Her ikisini de char(10) olarak set edip her iki kolona da ACicekci bilgisini girelim.

    --Kayıt gelir
    SELECT * FROM UYE WHERE UserNameTr='MCicekci' 
    
    --Kayıt gelmez
    SELECT * FROM UYE WHERE UserNameTr='MCICEKCI' 
    
    --Kayıt gelir
    SELECT * FROM UYE WHERE UserNameEng='MCicekci' 
    
    --Kayıt gelir
    SELECT * FROM UYE WHERE UserNameEng='MCICEKCI' 
    
    --Eğer TR collation'da her iki kaydında gelinmesi isteniyorsa
    -- COLLATE ifadesi kullanılır.
    SELECT * FROM UYE
    WHERE UserNameTr= 'MCIcekcI' COLLATE SQL_Latin1_General_CP1_CI_AS

    Tablodaki kolonun collation değerini değiştirmek için ALTER TABLE . . . ifadeesi kullanılır.

    ALTER TABLE  ALTER COLUMN  COLLATE 

    Son olarak önemli bir not ile konuyu kapatalım. Farklı collation türündeki kolonları birbirleriyle karşılaştıramayız. Yani örneğimizdeki UserNameTr ile UserNameEng kolonlarını birbiriyle karşılaştırmak istediğimizde Cannot resolve the collation conflict between “SQL_Latin1_General_CP1_CI_AS” and “Turkish_CI_AS” in the equal to operation. hatası oluşur.

    SELECT * FROM UYE
    WHERE UserNameTr=UserNameEng
  • 44 Responses to “SQL Server’de Language ve Collation kavramı”

    1. yoldaş erdoğan Says:

      Açıklayıcı bilgileriniz için teşekkürler.

      yoldas.cu.edu.tr

    2. Berna Botali Says:

      Daha once tanımlanmış bir veritabanının collaction degerini nasıl değiştirebiliriz ?

      ALTER DATABASE benimDatabase COLLATE TURKISH_CI_AS

      ile yapamadım..

      Teşekurler.

    3. Ahmet Kaymaz Says:

      Merhaba,

      ALTER DATABASE benimDatabase COLLATE TURKISH_CI_AS ifadesinin başarılı olabilmesi için veritabanının “single user mode”ta çalışıyor olması lazım. Yani bu işlemi yapmadan önce, “benimDatabase” isimli database üzerinde herhangi bir connection’ın açık olmadığından emin olmanız gerekir. Bunun için sp_who ifadesini kullanarak gelen sonuç içerisindeki dbname kolonunda bu database üzerinde herhangi bir connection olup olmadığını kontrol edebilirsiniz. Eğer varsa o işlemin spid değerini alıp kill ifadesiyle o processi iptal edebilirsiniz.
      Veya doğrudan bu işlemi, veritabanını anlık olarak single moda çekerek te T-SQL ile gerçekleştirebilirsiniz. ALTER DATABASE benimDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
      ALTER DATABASE benimDatabase COLLATE TURKISH_CI_AS
      ALTER DATABASE benimDatabase SET MULTI_USER

      Buna ek olarak bu işlemin, bütün index ve foreign key’lerinizi drop ve ardından rebuild ettiğini, nText, nvarchar gibi kolonların uyumluluğunun test edildiğini, yalnızca default collation olarak set edilmiş kolonların etkilendiğini, özellikle büyük veritabanların işlemin uzun sürdüğünü de gözönünde tutmanız faydanıza olacaktır.

    4. Tunç Askin Says:

      merhaba

      databese dilim TURKISH_CI_AS
      ama bazı table lerin içindeki COLLATION ler SQL_Latin1_General_CP1_CI_AS yazıyor ben bunları degıstırmek ıcın tek tek desing table ya girip yapıyorum
      bunun daha bır kolay yolu varmıdır
      tesekurler

    5. Ahmet Kaymaz Says:

      Merhaba Tunç bey, bu işlem için farklı alternatifler kullanabilirsiniz.Birinci yöntem olarak aşağıdaki adımları takip edebilirsiniz;

      1. Database’deki tüm nesnelerin SQL Script’i generate edilir.
      2. Script deyimlerinin içindeki COLLATE ifadeleri silinir
      3. Olmasını istediğimiz Collation tipinde yeni bir database oluşturulur.
      4. Oluşturulmuş SQL Script’in, “foreign key tanımlamaları” bölümü hariç bu database üzerinde çalıştırılarak tüm nesneler yaratılır.
      5. Data Import/Export aracılığıyla eski databaseteki veriler yenisine aktarılır
      6. “foreign key tanımlamaları” çalıştırılır.

      İkinci yöntem olarak katalog şemalar kullanılarak her tablodaki kolon için ALTER TABLE . . . ifadesi oluşturulur. Bu ifadede, düzenlenecek kolonun tablo, veri tipi, uzunluk, null kabul edip etmediği gibi bilgiler girilmelidir. Bu yüzden INFORMATION_SCHEMA.COLUMNS şeması kullanılır. Aşağıdaki T-SQL scripti bütün tablolardaki COLLATION_NAME değeri “SQL_Latin1_General_CP1_CI_AS” olan tüm kolonlar için çalıştırılacak ALTER TABLE ifadesini oluşurur.SELECT 'ALTER TABLE ' + TABLE_NAME +
      ' ALTER COLUMN ' + COLUMN_NAME + ' ' + DATA_TYPE +
      CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN '(max)'
      WHEN DATA_TYPE in ('text','ntext') THEN ''
      WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL
      THEN '('+(CONVERT(VARCHAR,CHARACTER_MAXIMUM_LENGTH)+')' )
      ELSE
      ISNULL(CONVERT(VARCHAR,CHARACTER_MAXIMUM_LENGTH),' ')
      END
      +' COLLATE TURKISH_CI_AS ' +
      CASE IS_NULLABLE WHEN 'YES' THEN 'NULL' WHEN 'No' THEN 'NOT NULL'
      END
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE DATA_TYPE IN ('varchar' ,'char','nvarchar','nchar','text','ntext')
      AND COLLATION_NAME = 'SQL_Latin1_General_CP1_CI_AS'
      Bu “ALTER TABLE . . .” ifadeleri single modda çalıştırıldığı zaman ilgili kolonların collation değeri “TURKISH_CI_AS” olarak set edilmiş olur.

    6. Yener Arslan Says:

      Teşekkürler.

    7. Murat Çim Says:

      Verdiğiniz bilgiler çok faydalı.
      Teşekkürler.

    8. Yoldaş Yılmaz Says:

      MÜKEMMEL, sade anlatımınız ve doyurucu bilgilerinizden dolayı teşekkür ederim.
      Aradığım çoğu sorunuma, tek bir çözüm dökümanı sunmuşsunuz. Başarılı çalışmalarınızın artarak devam etmesi dileklerimle…

    9. Umit Dorduncu Says:

      Merhaba,
      SQL 2005 uzerindeki TURKISH_CI_AS olan bir database imde Rusça ve Yunanca karakterleri de gormek istiyorum, bunun icin Collation değerini SQL_Latin1_General_CI_AS yapmak istiyorum ama server uzerinden bu değişikliği yapamiyorum.

      bu hatayi aliyorum :

      TITLE: Microsoft SQL Server Management Studio
      ——————————

      Alter failed for Database ‘airties’. (Microsoft.SqlServer.Smo)

      For help, click: http://go.microsoft.com/fwlink?

      ——————————
      ADDITIONAL INFORMATION:

      An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

      ——————————

      The database could not be exclusively locked to perform the operation.
      ALTER DATABASE failed. The default collation of database ‘airties’ cannot be set to Latin1_General_CS_AI. (Microsoft SQL Server, Error: 5030)

      For help, click: http://go.microsoft.com/fwlink?
      ———
      Yardimci olabilir misiniz?

      Tesekkurler..

    10. Ahmet Kaymaz Says:

      Ümit bey,

      database’in collation değerini nasıl değiştirmeye çalıştığınızı da yazmış olsaydınız sonuca daha hızlı varmış olurduk. Bunu “ALTER DATABASE” ifadesiyle yapmaya çalışıyorsunuz diye tahmin ediyorum. SQL Server’da bir database’in collation bilgisini değiştirmek için o database’i öncelikle single moda getirmeniz gerekmektedir. Aşağıdaki kodu master veritabanına geçip olduğu gibi kullanırsanız sorununuz çözülür diye düşünüyorum.ALTER DATABASE airties SET SINGLE_USER WITH ROLLBACK IMMEDIATE
      ALTER DATABASE airties COLLATE SQL_Latin1_General_CP1_CI_AS
      ALTER DATABASE airties SET MULTI_USER

      Ayrıca “SQL_Latin1_General_CI_AS” ismiyle “SQL_Latin1_General_CP1_CI_AS” serisini kasdediyorsunuz sanırım.

    11. Volkan GÖKBAYRAK Says:

      Merhaba,
      Çok teşekkürler Ahmet bey makaleniz için,
      Bir sorun olucak zaman ayırırsanız,
      Sql Serverımda “Server Collation” “SQL_Latin1_General_CP1254_CS_AS” olarak kurulu.
      Yeni bir programa geçiş aşamasındayız ve bu program “Turkish_CI_AS” ile çalıştığını bildirdiler.Şu an kullanılan muhasebe programı ise
      Üzerinde çalışan muhasebe uygulamasına destek veren ekip “Turkish 1254 case sensitive” olarak çalışması gerektiğini söylüyorlar.
      Bu noktada sorum şu olucak SQL_Latin1_General_CP1254_CS_AS,
      “Turkish_CI_AS” ile “Turkish 1254 case sensitive” kapsamaktamıdır.Bu 2 muhasebe programını aynı serverda mevuct haliyle sorunsuz çalıştırabilirmiyim.
      Teşekkür ederim

    12. Ahmet Kaymaz Says:

      Merhaba Volkan bey,

      Collation değeri birbirinden farklı iki database aynı server üzerinde çalışabilir hatta farklı collation değerine sahip iki farklı tablo aynı database içinde de çalışabilir. Ama bu tablolar arasında JOIN işlemi yapmaya çalıştığınızda ya da aktarım gibi işlemlerde bulunduğunuzda Cannot resolve collation conflict for equal to operation. şeklinde collation hatası alırsınız. Ama anladığım kadarıyla bu iki database’in birbiriyle ilişkisi olmayacak bu durumda aynı SQL Server Instance üzerinde farklı collation değerlerine sahip olmaları sorun oluşturmayacaktır.
      Yeni bir database oluşturduğunuzda varsayılan olarak database’in collation değeri “(Server default)” seçimlidir. Ama bunu değiştirip database’e özgü collation tanımlayabilirsiniz. Aynı şekilde bir tablodaki char tipindeki kolonları oluşturduğunuzda varsayılan olarak içinde bulunduğu database’in collation değerini alır fakat bunu kabul etmeyi o kolon için farklı bir collation tanımlayabilirsiniz.

    13. Volkan Gökbayrak Says:

      Teşekkür Ederim.
      Sayğılar

    14. serdar Says:

      gercekten çok güzel bir döküman ellerinize sağlık

    15. Yunus Kellekule Says:

      Merhaba Ahmet Bey,

      SqlServer ile turkce karakterler ile ilgili bir problemim var. Internette cozum ararken sitenize rastladim. Umarim siz bir cozum sunabilirsiniz.

      Yakin zamanda bir Turk sirketi ile calisacagimiz icin, veritabanini ayarlamaya calisiyorum. Veritabaninda herhangi bir tablonun, kolomunu (ing. Column) Turkce karakterlere uyarmam gerek.

      Uyguladigim query sirasiyla:
      1. alter table PARAMETER alter column PARAMETERVALUE nvarchar(1500) COLLATE Turkish_CI_AS;

      2. update PARAMETER set PARAMETERVALUE = ‘ç;ı;ğ;ö;ş;ü’ where PARAMETERNAME = ’specialtoken’

      3. select PARAMETERVALUE from PARAMETER where PARAMETERNAME = ’specialtoken’

      Son querynin sonucu: ç;i;g;ö;s;ü

      Yani Turkce karakterli degil.

      Daha sonra:
      ALTER DATABASE Demo SET SINGLE_USER WITH ROLLBACK IMMEDIATE
      ALTER DATABASE Demo COLLATE Turkish_CI_AS
      ALTER DATABASE Demo SET MULTI_USER

      denedigim zaman:
      Server: Msg 5075, Level 16, State 1, Line 1
      The object ‘SEARCHFIELD’ is dependent on database collation.
      Server: Msg 5075, Level 16, State 1, Line 1
      The object ‘VALIDATOR’ is dependent on database collation.

      seklinde uyarilar cikiyor.

      Simdiden tesekkurler,

      Yunus Kellekule
      Icorp (Hollanda)

    16. Ahmet Kaymaz Says:

      Merhaba Yunus bey,

      Aslında normal şartlar altında Türkçe karakterleri doğru yazıyor ve okuyor olmanız gerekiyor. Fakar işlemi daha garantilemek için Windows Collation yerine SQL Collation kullanmak ve kodlarınızı unicode standarta (değerlerin başına “N” harfini eklemek) uygun olarak işlemek daha iyi bir çözüm olabilir. Yani şu işlemi yapmanız mümkün mü.
      alter table PARAMETER alter column PARAMETERVALUE nvarchar(1500) COLLATE Turkish_CI_AS;
      update PARAMETER set PARAMETERVALUE = N'ç;ı;ğ;ö;ş;ü' where PARAMETERNAME = 'specialtoken'
      select PARAMETERVALUE from PARAMETER where PARAMETERNAME = 'specialtoken'
      Eğer bu kod başarılı olmazsa SQL Collation türünü deneyebilirsiniz. Hem böylece Code Page de değiştirilmiş olur.
      alter table PARAMETER alter column PARAMETERVALUE nvarchar(1500) COLLATE SQL_Latin1_General_CP1254_CI_AS;

      Aldığınız hata, “schema-bound object ” schemayı yüklemiş nesnelerin, bulundukları database’in collation değerine bağlı olmasından kaynaklanmaktadır. Schema-bound objeleri şunlardır;
      SCHEMABINDING ifadesiyle oluşturulmuş User-defined function ve View (Oracle’daki materialised view)
      Computed column
      CHECK constraint

      Veritabanınızda bu nesneler olduğu sürece veritabanını collation değerini değiştiremezsiniz. Büyük ihtimalle veritabanınızda WITH ENCRYPTION veya WITH SCHEMABINDING ile oluşturulmuş view veya functionlar vardır veya bahsi geçen kolonlar üzerinde Check Constraint’ler oluşturulmuştur. Örneğin aşağıdaki queryi çalıştırıp bu viewi yarattıktan sonra vwGetMusteri nesnesi MUSTERI tablosu na referans verdiği yani doğrudan onu gösterdiği için MUSTERI tablosu üzerinde değişiklik yapamazsınız “ALTER TABLE MUSTERI” ifadesi hata verecektir. CREATE VIEW vwGetMusteri With SCHEMABINDING
      As
      SELECT
      AdSoyad, Unvan FROM DBO.MUSTERI

      Bu arada şunu söylemekte fayda vardır. Bir database’in Collation değerini değiştirmeniz içerde var olan nesnelerin collation değerini değiştirmez. Yani nesneler için ReCollate işlemi gerçekleşmez. Bu sorunlara karşılık size tavsiyem istediğiniz collation türünde yeni bir database yaratmak ve önceki database içindeki tüm nesnelerin SQL Script’ini oluşturup script içerisindeki collation bilgilerini yok edip scripti yeni database’de çalıştırmanız ardından da DTS ile dataları yeni veritabanına taşımanızdır.

    17. ihsan erbil Says:

      İyi Günler,
      Makaleniz oldukça güzel olmuş, fakat asıl bende takdir hisleri uynadıran; soruların hiçbirini es geçmeden cevaplamış olmanız. Bundan cesaret alarak bir soru da ben sormak istiyorum.
      Geçmişte DOS ortamı için tasarlanmış bir program ile oluşturulmuş veritabanına sahibim.Dolayısıyla veritabanında hiç türkçe karakter kullanılmamış. Bu veri tabanını sqlserver ortamına aktardım.Şimdi ben bir web programı yazıyorum ve benim kullanıcım normal olarak türkçe karakter kullanarak ta aradığını bulmak istiyor. Mesela “türkçe” yazıp “TURKCE” içeren veriler çekebilmem için; database’in Collate özelliğinden faydalanmam mümkün mü?

    18. Yunus Kellekule Says:

      Ahmet Bey,
      Bilgilendirdiginiz icin tesekkurler.
      Unicode standardi (N) ile turkce karakterleri tabloya katabilidim.
      En son tavsiyeniz, bence en uygun olani: Trukce karakterli yeni bir veritabani olusturmak.

      Tekrar tesekkurler,
      Yunus Kellekule

    19. Ahmet Kaymaz Says:

      İhsan bey,

      buradaki amacımız birlikte birşeyler öğrenmek olunca hiçbir ayrıntıyı hiçbir soruyu gözden kaçırmamak gekir diye düşünüyorum.

      Yapmak istediğinizi collation tabanlı bir sorgulamayla çözebilirsiniz. Tablonuzun C1 isimli kolonunda türkçe, TÜRKÇE, turkce, TURKCE,İŞİÇÖĞÜ,ISICOGU kayıtlarının bulunduğunu düşünelim. Sorgulama esnasında collate sözcüğüyle Türkçe karakterlerini desteklemeyen bir collation kullanırsanız aynı değerleri getirebilirsiniz. Örneğin şuanda aklıma Fransızca collation geldi. Aşağıdaki sorgulama tüm “türkçe” kayıtlarını getirir.SELECT * FROM TB
      WHERE C1 collate French_CI_AI='Türkçe'
      Aynı şekilde eski kayıtlara uygun da arama yapılabilir. SELECT * FROM TB
      WHERE C1 collate French_CI_AI='TURKCE'

      Aynı mantıkla aşağıdaki satır da “İŞİÇÖĞÜ” ve “ISICOGU” kayıtlarını getirir. SELECT * FROM TB
      WHERE C1 collate French_CI_AI='İŞİÇÖĞÜ'


      Fakat bu işi bu şekilde collate ile yapmak hem performans açısından hem de usul açısından doğru olmaz kanısındayım. Bunun yerine bir REPLACE fonksiyonu kullanarak türkçe karakter dönüşümü yapmanız bir SQL Server geliştiricisine yakışır daha doğru bir davranış olacaktır.

    20. Yasin Özbey Says:

      Merhaba Ahmet bey
      Makaleleriniz çok faydalı teşekkürler.Benim sormak istediğim karakter seti değiştireceğimiz kolonda index veya anahtar varsa alter column hata veriyor.internette yaptığım araştırmada index veya anahtarları silip yeniden yaptıklarını gördüm sizce bu şekilde kayıt olan bi tablonun yapısını bozarmıyım veya yavaşlatırmıyım
      Teşekkürler

    21. Ahmet Kaymaz Says:

      Yasin bey,

      üzerinde index bulunan kolona ait collation değerini değitirmek istediğinizde büyük ihtimalle The index ‘‘ is dependent on column ‘ şeklinde hatası alıyorsunuzdur. Bunun için indexlerini kaldırıp yeniden oluşturmanız gerekiyor. Size tavsiyem, Generate SQL Script bölümünden bu tabloya tüm indexlere ait SQL Script’i çıkarmanız ve collation değişiminden sonra tekrar çalıştırmanızdır.

    22. Erdal Sert Says:

      Ahmet Bey,

      Collation’ı SQL_Latin1_General_CP1_CI_AS olarak set edilmiş bir sqlserver 2005 ve üzerinde aynı collation’da database’ler var.

      Bu databaselerde varchar olarak tutulan sahalardaki Türkçe karakterlerde sorunlar var.
      İ ler Y
      Ş ler ?
      şeklinde görülüyor. bu database’lere yazdığımız uygulamalarda da, dataları bu şekilde bozuk alıyoruz.
      Acaba bu karakterleri düzeltmenin bir yolu varmıdır ?
      Bu konuda öneriniz olur mu ?

    23. Ahmet Kaymaz Says:

      Erdal bey,

      İlk bakışta sorunun Collation tipinden kaynaklandığını söyleyebiliriz ancak bu durumda SQL_Latin1_General_CP1_CI_AS için “İ” lerin “Y” olarak değil “I” olarak yazılıyor olması lazım. Şu şekilde bir deneme yapmanızı tavsiye ederim. T1 isminde bir tablo oluşturalım bu tabloya varchar türünde C1 ve C2 kolonlarını ekleyelim. C1′in collation tipini SQL_Latin1_General_CP1_CI_AS, C2′nin collation tipini, Turkish_CI_AS olarak set edelim. Ardından şu cümleyi çalıştıralım.
      INSERT T1 VALUES('İÇÖĞÜŞ','İÇÖĞÜŞ')
      SELECT * FROM T1
      Bu querynin sonucunda veya doğrudan Management Studio’da tabloya baktığınızda “İÇÖĞÜŞ” değerini “IÇÖGÜS” olarak görüyorsanız bu sorunun collationdan kaynaklandığını ve bunu ancak collation tipini değiştirerek çözebileceğinizi söyleyebiliriz. Bu durumda aşağıdaki gibi bir sorgulama Insert ettiğimiz kaydı getirir.SELECT * FROM T1 WHERE C1='İÇÖĞÜŞ' Fakat aşağıdaki sorgulamayı denediğimizde hiçbir kaydın gelmiyor olması lazım. SELECT * FROM T1
      WHERE C1='İÇÖĞÜŞ' COLLATE Turkish_CI_AS


      Eğer queryleirn sonuçları bu şekilde olmuyorsa, veriler tabloda doğru görünüyorsa sadece client uygulamanızda yanlış görünüyorsa uygulamanızın lokalizasyon değerlerini değiştirmeniz gerekir.

    24. Erdal Sert Says:

      Tekrar Merhaba,

      CREATE TABLE Z1(T1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS,
      T2 VARCHAR(50) COLLATE Turkish_CI_AI)
      go
      INSERT Z1 VALUES('İÇÖĞÜŞ','İÇÖĞÜŞ')
      SELECT * FROM Z1

      şöyle bir tablo yarattıp dediğiniz gibi insert yaptım.
      Select query’lerin sonuçlarıda şöyle…

      SELECT * FROM Z1 WHERE T1=’İÇÖĞÜŞ’

      T1 T2
      ——————– ——————
      IÇÖGÜS IÇÖGÜS

      (1 row(s) affected)

      ** ve ,

      SELECT * FROM Z1
      WHERE T1=’İÇÖĞÜŞ’ COLLATE Turkish_CI_AS
      T1 T2
      —————- —————————-
      IÇÖGÜS IÇÖGÜS

      (1 row(s) affected)

      Bu durumda şöyle bir deneme daha yaptım.
      C# ile bağlantıda sqlclient class’nı kullanırsam bu Türkçe karekterler bozuk geliyor, ilk yazdığım gibi İ ler Y vb..

      Fakat sqlclient yerine OleDB seçersem ve connection string’de “auto translate=false” paremtresini kullanrsam Türkçe’ler düzgün geliyor. Fakat bu seferde Insert cümlelerindeki Türkçe karakterleri değiştirip yazıyor.
      İ leri I , Ş leri S ve Ğ leride G olarak insert ediyor.

      Yani tam sorun oldu bu iş.
      SqlClient kullansam Select’de sorun var, OleDB kullansam Insert’de sorun var.

      Bir öneriniz olursa çok sevinirim…..

    25. Ahmet Kaymaz Says:

      Erdal bey,

      normal şartlar altında veritabanınızdaki collation değerini Turkish_CI_AS olarak set ettiğinizde ve web tarafında da utf-8′i referans aldığınızda Türkçe karakter sorununuzun kalmaması gerekir. Eğer hala devam ediyorsa SQL Server ve Framework’ü yeniden kurmanızı ve sunucudaki yerel ayarlarını kontrol etmenizi tavsiye ederim.

    26. Erdal Sert Says:

      Ahmet bey,

      pratikde Turkish_CI_AS ile Turkish_CI_AI arasında fark gördünüzmü ?

    27. Ahmet Kaymaz Says:

      Evet arasındaki aksan, şive dolayısıyla pratikte fark bulunmaktadır.

      Bu işin özeti şudur; birçok programcı için sorun oluşturan SQL Server’daki bu Türkçe karakter sorunu, Türkçe karakterlerinin bulunduğu character set’inin kullanılmasıyla çözülür. Bilindiği gibi Türkçe karakterleri, 16 gruptan oluşan Avrupa dil karakter setinin 9. grubu olarak ISO tarafından standart hale getirilerek ISO 8859-9 koduyla temsil edilmektedir. Bu karakter setleri referans alınarak IBM ve Microsoft Windows işletim sistemi tarafından bu karakterlerin tanınması, print edilebilmesi için Codepage denilen karakter setleri oluşturuldu. Microsoft’un oluşturduğu set, ANSI codepage olarak tanımlanır ve 1250-1258 arasındaki sayılarla temsil edilir. Örneğin 1254, Türkçe, 1256, Arapça dil karakter setini bildirir.
      SQL tarafında Türkçe karakterlerini desteklemek için Codepage 1254′in bulunduğu şu collationlar kullanılabilir;
      Turkish_BIN
      Turkish_CI_AI
      Turkish_CI_AS
      Turkish_CS_AI
      Turkish_CS_AS
      SQL_Latin1_General_Cp1254_CS_AS
      SQL_Latin1_General_Cp1254_CI_AS

      Collation yapısını, SQL Server’daki karakter karşılaştırma yöntemi olarak yorumlamalıyız. Bu collationların farkı, büyük küçük harf duyarlılığının olması ve aksan farklılıklarına karşı hassasiyeti desteklemesidir. Verdiğiniz iki collation arasındaki fark, aksana göre büyük küçük harf duyarlılığıdır. Aksan veya şive dediğimiz şey, çoğu zaman bölge ve şehir farklılığı sonucu kelimelere yapılmış vurgular olarak ortaya çıkar. Örneğin Karadeniz bölgesindeki “cideyrum” bir aksan farklılığıdır. “À Á Â Ã Ä Å” harfleri, “A” harfinin aksan farklılıkları sonucu ortaya çıkmıştır. Bu yüzden aksan yapısına göre “Kağıt” ile “Kâğıt” ifadeleri aynı değildir.

      Turkish_CI_AI ile Turkish_CI_AS arasındaki fark, aksan farklılıklarına karşı hassas olup olmayacaklarıdır. Bu farkı anlamak içina aşağıdaki örneği bu collation türlerine sahip iki farklı database’de çalıştıralım.DECLARE @Harf1 char(1)
      DECLARE @Harf2 char(1)
      set @Harf1 ='â'
      set @Harf2 ='a'

      if @Harf1 = @Harf2
      print 'a ile â aynı kabul edilir.'
      else
      print 'a ile â aynı kabul edilmez.'

      Bu query’i, Turkish_CI_AI türündeki bir database’de çalıştırırsanız a ile â aynı kabul edilir. mesajı, Turkish_CI_AS türündeki bir database’de çalıştırırsanız a ile â aynı kabul edilmez. mesajı döner. Eğer collation tipini Turkish_BIN yaparsak, bu durumda binary olarak karşılaştırma yapılacak ve “A” ile “a” aynı muameleyi görmeyecektir.

      Artık bu bilgiler ışığında kendi ihtiyacınıza en uygun collation değerini seçmelisiniz. Öncelikle database tarafındaki karakter sorununu halletmeniz gerekiyor. Client uygulama tarafında, sunucu yerel ayarları veya .NET’teki Culture nesnesiyle bu iş çözülür.

    28. Erdal Sert Says:

      Yardım ve önerileriniz için teşekkür ederim.

      İyi çalışmalar…

    29. candan ildeniz Says:

      Merhaba Ahmet bey,

      Bir SQL server 2000′in code page’i Cyrillic_General_CI_AS, database’lerde de aynı ama tablolarda hala Cyrillic karakterleri “?” işareti vb alakasız şekillerde görüntüleyebiliyorum. Aşağıdaki collationları denedim ama başarılı olamadım. Problem ne olabilir ?

      104 Cyrillic_General_BIN (or Ukrainian_BIN, Macedonian_BIN)
      105 SQL_Latin1_General_Cp1251_CS_AS
      106 SQL_Latin1_General_Cp1251_CI_AS
      107 SQL_Ukrainian_Cp1251_CS_AS
      108 SQL_Ukrainian_Cp1251_CI_AS

      teşekkürler.

    30. Ahmet Kaymaz Says:

      Merhaba,

      Cyrillic karakterleriyle ilgili sizin de listelediğiniz gibi birçok collation tanımlaması var. Bu da sanırım çok sayıda dilin bu alfabeleri kullanmasından kaynaklanıyor. Örnek olarak rusçadaki ????? harflerini kullanalım. Öncelikle database collation ne olursa olsun bir kolona her türlü karakterin tutulmasını istiyorsak o kolonu unicode olarak tanımlamalıyız yani ya nchar ya da nvarchar kullanmalıyız. Ve bu kolonlara kayıt eklerken, kolonda arama ve güncelleme yaparken mutlaka değerin önüne onun unicode olduğunu ifade eden “N” önekini kullanmalıyız. Bu durumda nchar veya nvarchar kolonda Cyrillic karakterlerini de Arapça karakterlerini de rahatlıkla tutabiliriz. Ama char veya nchar gibi non-unicode kolonlara kaydedeceğimiz veri için o kolonun Collation tanımlamasının ne olduğunu önemlidir. Örneğin Turkish_CI_AS olarak set edilmiş bir char veya nchar kolonuna başına “N” eklesek bile hiçbir şekilde Cyrillic veya Arapça alfabesinden bir değer girilemez, ???? olarak görülür. Eğer bu kolonlara Cyrillic karakterlerini de yazdırmak istiyorsak o zaman Cyrillic tabanlı bir collation seçmeniz yeterli olacaktır. Sizin vermiş ilk bakışta gözüme çarpan Cyrillic_General_CI_AI tipi yeterli gelecektir. Bu durumda da yine SQL Server’e veri gönderirken mutlaka başında “N” ifadesi olmalıdır.

      Buna rağmen Cyrillic karakterlerini SQL Server’da doğru barındıramıyorsanız tablonun sql scriptini incelemek lazım. Sözkonusu scripti ve örnek bir insert, update cümlesi yazabilirseniz daha iyi yardımcı olabilirim.

    31. FZK Says:

      Merhaba;

      Uzun süredir Türkçe Collation’ı olan bir SQL 2000 veritabanı kullanıyordum (default server collationı latin idi). Bugün içindeki tabloları collation’ı Latin olan bir SQL 2005 veritabanına sorunsuz aktardım. Yani Türkçe karakterler doğru olarak gitti. Ama mesela yeni kayıt girişi veya güncellemesi yaptığımda başına “N” koymassam eğer Türkçe karakterler (ş, ı, ğ) Latin’e çevriliyor. ‘N kullanmadan bu sorunu halledemem mi acaba?

    32. Ahmet Kaymaz Says:

      Merhaba,

      Aktardığınız tablo doğal olarak hedef database’in collation değerini alacaktır. Latin derken neyi kastettiğinizi anlamadım. Latin1_General_CI_AS seçeneğini mi kastediyorsunuz. Database’i olduğu gibi değil belli tabloları import/export yaptığınız için bu tabloların collation değeri değişir. Bunu engellemek yani tabloların collation değerlerini koruması için önceki database üzerinde bu tabloları SQL Script’ini oluşturup yeni serverde çalıştırırsınız ardından import/export aracıyla datalar taşınır.

      Yeni sunucuda yeni kayıtları girdiğiniz neden Türkçe karakterlerin düzgün yazılmadığı ya da “N” önekini kullanma zorunluluğu tablonuzun yapısına bağlı bir durum. Önceki sunucudaki tabloya ait SQL Script veya yeni sunucudaki tabloya ait SQL Script’i gönderebilirseniz daha net görürüz.

    33. ali haydar eroğlu Says:

      Ahmet Bey verdiğiniz bilgilerle takılmış olduğum bir işte büyük yok aldığımı düşünüyorum. Emeğiniz ve paylaştığınız bilgi için çok teşekkürler.

      sitenize google da collation ı serch ederken ulaştım. sql2005 de mevcut bir database in collation ı SQL_Latin1_General_CP1251_CI_AS, bense bunu SQL_Latin1_General_CP1_CI_AS e çevirmeye çalışıyorum. bunu için yukarıda verdiğiniz sorguyu çalıştırdım. ALTER DATABASE benimDatabase SET (SINGLE_USER WITH ROLLBACK IMMEDIATE
      ALTER DATABASE benimDatabase COLLATE TURKISH_CI_AS
      ALTER DATABASE benimDatabase SET MULTI_USER)
      ancak aşağıdaki hata mesajlarını aldım.
      Msg 5075, Level 16, State 1, Line 1
      The object ‘TBLNPMRELDET_CHK1′ is dependent on database collation.
      Msg 5075, Level 16, State 1, Line 1
      The object ‘NETPROCESSID’ is dependent on database collation.
      Msg 5075, Level 16, State 1, Line 1
      The object ‘CC_PAYDA_1′ is dependent on database collation.
      Msg 5075, Level 16, State 1, Line 1
      The object ‘CC_PAYDA2′ is dependent on database collation.
      Msg 5072, Level 16, State 1, Line 1
      ALTER DATABASE failed. The default collation of database ‘TENIS06′ cannot be set to SQL_Latin1_General_CP1_CI_AS.

      çözümün ne olduğunu yine yukarııda yazmışsınız.
      (Generate SQL Script bölümünden bu tabloya tüm indexlere ait SQL Script’i çıkarmanız ve collation değişiminden sonra tekrar çalıştırmanızdır.)

      ancak sql konusunda yeni olduğum için bu cümle benim için fazla birşey ifade etmiyor. sanırım bunun anlamını öğrendiğimde sorunumuda çözmüş olacağım.

      iyi çalışmalar, teşekkürler.

    34. ali haydar eroğlu Says:

      indexlerin kaldırılması nedemektir, nasıl yapılır? collation dan sonra bu table ların indexi nasıl oluşturulur?

    35. Ahmet Kaymaz Says:

      Haydar Bey,

      eğer bu hatayı “ALTER DATABASE” ifadesinde alıyorsanız sorun indexlerden değil veri tabanında bulunan constraint’lerden kaynaklanıyordur. Bu yüzden öncelikle constraint’leri önce kaldırıp collation bilgisini düzenledikten sonra oluşturmalısınız. Aynı durum tablolar üzerindeki indexler için de geçerlidir.

      Size tavsiyem öncelikle database’in tüm SQL Script’ini oluşturmanız ardından bu script’teki collation bilgilerini isteğinize göre düzeltmeniz ve bu script’i kullanarak yeni bir database oluşturmanızdır. Ardından eski database’den yeni database’e verileri import/export yöntemiyle aktarmanızdır.

      Bir database’in SQL Script’ini çıkarmak için Management Studio içerisinde Database’i sağ tıklayıp Tasks bölümünden “Generate Scripts” menüsünü kullanabilirsiniz. Bu bölüm bir wizard olduğu için sizi yönlendirecektir.

    36. Orhan kızıltee Says:

      Ahmet Bey, makaleniz için çok teşekkür ederim;

      yazmakta olduğum C# uygulamasının farklı sunucularda çalışablimesini sağlamak istiyorum, bunun için sunucunun Tarih formatını öğrenip , o formata dönüştürerek sorgularımı oluşturmak istiyorum.

      sunucunun veya bir veritabanının tarih formatına ait bilgiyi nasıl alabilirim.

      denediğm sunucuda

      SELECT @@LANGUAGE — > us_english dönüyor fakat,
      ” select collation_name from sys.databases where name = N’VeriTabani’ ”
      sorgumun sonucunda “Turkish_CI_AI” dönüyor.
      hangisini dikkate almalıyım?

      İyi çalışmalar..

    37. Ahmet Kaymaz Says:

      Orhan Bey,

      ilginiz için teşekkür ederim. SQL Server’da tarih, sayı formatı gibi yerel bilgiler aktif user’in language bilgisine bağlıdır. Database’in collation bilgisiyle ilişkisi bulunmamaktadır. Sorguyu hangi kullanıcıyla sunucuya gönderiyorsanız o kullanıcının tarih formatı referans alınır. Örneğin dili Türkçe olan bir kullanıcı için aşağıdaki tarih formatı hata verir.

      DECLARE @Tarih Datetime
      SET @Tarih = ‘2008/12/31′
      PRINT @Tarih

      Aynı format, dili isveççe(Swedish-Svenska) olan kullanıcı için hata vermeyecektir.
      Çünkü Svenska için tarih formatı “ymd”, Türkçe için “dmy” şeklindedir.
      Bağlı olduğunuz kullanıcının hangi dile sahip olduğunu sizin de yazdığınız gibi @@LANGUAGE genel değişkenle öğrenilir. Hangi dilin handi formata sahip olduğunu da sp_helplanguage yordamından öğrenebilirsiniz.

      O anki güncel yani bağlandığını kullanıcı bilgisini SELECT SYSTEM_USER ile alabilirsiniz. Aynı şekilde aşağıdaki gibi küçük bir sorgulamayla o anki tarih formatını da okuyabilirsiniz.
      SELECT dateformat FROM master..syslanguages WHERE name=@@LANGUAGE

      Eğer girilecek tarih formatı aynı ve sadece sunucunun tarih formatı değişken olabiliyorsa her defasında sistem üzerindeki tarih formatını öğrenip ona göre sorgu oluşturma yerine acaba CONVERT() metodu ile standart bir tarih formatı oluşturmanız veya oturum esnasında “SET DATEFORMAT” komutuyla kendi tarih formatınızı belirlemeniz daha mantıklı olmaz mı.

    38. osman kartal Says:

      Verdiğiniz değerli bilgileri için çok teşekkür ederim
      Serverdaki dil problemine bir çözüm getirdim

    39. Aynur Says:

      Merhaba,
      DB’de collation’ı Cyrillic yaptım ve php ile verileri çektim. Ama explorerda veriler düzgün görülmüyor. Bunu nasıl çözebilirim? Php sayfası içerisine yazdığım verilerde sorun yok. Sadece db’den gelen veriler bozuk geliyor.

    40. Ahmet Kaymaz Says:

      Merhaba,

      Bahsettiğiniz collation sorunu MS SQL Server için mi yoksa MySql için mi geçerli. Veritabanındaki karakterleri okurken mi yoksa yazarken mi sorun çıkıyor. Öncelikle verilerin database tarafında doğru göründüğünden emin olmak gerekir. Eğer o tarafta doğru görünüyorsa sorun html sayfasının karakter yapısından kaynaklanıyor olabilir. Bir parça kod paylaşabilirseniz daha doğru bir çözüm üretebiliriz.

    41. Aynur Says:

      Db’ye kaydedebiliyorum.Hatta query analyser üzerinde select sorgusu ile verileri çekebiliyorum. PHP kodu içerisinde verileri db’den çektiğim zaman sorun çıkıyor. Mesela dönen kaydı echo $values[0]; diyerek ilk kaydı yazdırmaya çalışıyorum ve sonuç olarak ���������
      veya ?�??,.??????
      şeklinde karakterler çıkıyor. PHP sayfası içerisinde verileri yazıyorum ve düzgün şekilde görüntüleyebiliyorum. utf8 charset kullanıyorum sorunsuz görüntülüyorum. DB’den gelen kayıtlarda sorun var. Ben Rusçayı uygun bir windows cyrliic fontu ile çözdüm şimdi de Kazakça ile deneme yapıorum ve çözemedim. Kazakça da harici 8 karakter var onda sorun veriyor. Kafam karıştı iyice :(

    42. Ahmet Kaymaz Says:

      SQL Server için collation değerini doğru ayarlamak ve sözkonusu kolonların veri tipini unicode yapmak yeterli olmaktadır. Bundan emin olmak için de SQL Server içinde INSERT veya SELECT işlemi unicode olarak yapılır fakat Query Analyzer’dan bu verileri doğru okuduğunuzu söylüyorsunuz. Bu durumda sorun SQL Server’den değil PHP tarafından kaynaklanmaktadır. Bu da iki neden kaynaklanıyor olabilir. PHP’nin MSSQL’e bağlanmak için kullandığı driver’in özelliklerine bakmak gerekiyor gerçekten UTF-8 veya ilgili charset’i destekliyor mu. Bundan emin olmak için bir iki satırdan oluşan bir asp sayfası veya vbscript hazırlayıp sorunun PHP’den mi yoksa SQL Server tarafından mı kaynaklandığı öğrenilebilir. İkinci muhtemel durum da PHP server tarafından generate edilmiş olan HTML çıktının sayfa karakter kodu Kazakça’yı gösteremiyor olabilir.

    43. Adem Uysal Says:

      Gerçekten oldukça yararlı bir çalışma. Teşekkürler.

    44. ARTI Says:

      Eline koluna sağlık gerçekten çok açık ve anlaşılır bir döküman olmuş. Teşekkür ederim.

    Leave a Reply

    WP Theme & Icons by N.Design Studio
    Entries RSS Comments RSS Giriş