SQL Server Language ve Collation kavramı

SQL Server Language ve Collation Nedir ?

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 
    Son olarak önemli bir not ile konuyu kapatalım. <strong>Farklı collation türündeki kolonları birbirleriyle karşılaştıramayız.</strong> Yani örneğimizdeki <em>UserNameTr</em> ile <em>UserNameEng</em> kolonlarını birbiriyle karşılaştırmak istediğimizde <font color="#ff0000">Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Turkish_CI_AS" in the equal to operation.</font> hatası oluşur.
    [sql]SELECT * FROM UYE
    WHERE UserNameTr=UserNameEng
  • SQL Server Language ve Collation kavramı” hakkında 130 yorum

    1. Berna Botali

      Daha once tanımlanmış bir veritabanının collaction degerini nasıl değiştirebiliriz ? ALTER DATABASE benimDatabase COLLATE TURKISH_CI_ASile yapamadım..Teşekurler.

      Cevapla
    2. Ahmet Kaymaz Yazar

      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.

      Cevapla
    3. Tunç Askin

      merhabadatabese 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

      Cevapla
    4. Ahmet Kaymaz Yazar

      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.

      Cevapla
    5. Yoldaş Yılmaz

      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.

      Cevapla
    6. Umit Dorduncu

      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..

      Cevapla
    7. Ahmet Kaymaz Yazar

      Ü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.

      Cevapla
    8. Volkan GÖKBAYRAK

      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

      Cevapla
    9. Ahmet Kaymaz Yazar

      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.

      Cevapla
    10. Yunus Kellekule

      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)

      Cevapla
    11. Ahmet Kaymaz Yazar

      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 constraintVeritabanı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.

      Cevapla
    12. ihsan erbil

      İ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ü?

      Cevapla
    13. Yunus Kellekule

      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

      Cevapla
    14. Ahmet Kaymaz Yazar

      İ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.

      Cevapla
    15. Yasin Özbey

      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

      Cevapla
    16. Ahmet Kaymaz Yazar

      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.

      Cevapla
    17. Erdal Sert

      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 ?

      Cevapla
    18. Ahmet Kaymaz Yazar

      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.

      Cevapla
    19. Erdal Sert

      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…

      Cevapla
    20. Ahmet Kaymaz Yazar

      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.

      Cevapla
    21. Ahmet Kaymaz Yazar

      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_ASCollation 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.

      Cevapla
    22. candan ildeniz

      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_ASteşekkürler.

      Cevapla
    23. Ahmet Kaymaz Yazar

      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.

      Cevapla
    24. FZK

      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?

      Cevapla
    25. Ahmet Kaymaz Yazar

      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.

      Cevapla
    26. ali haydar eroğlu

      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.

      Cevapla
    27. ali haydar eroğlu

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

      Cevapla
    28. Ahmet Kaymaz Yazar

      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.

      Cevapla
    29. Orhan kızıltee

      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..

      Cevapla
    30. Ahmet Kaymaz Yazar

      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 @TarihAynı 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=@@LANGUAGEEğ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ı.

      Cevapla
    31. osman kartal

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

      Cevapla
    32. Aynur

      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.

      Cevapla
    33. Ahmet Kaymaz Yazar

      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.

      Cevapla
    34. Aynur

      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 :(

      Cevapla
    35. Ahmet Kaymaz Yazar

      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.

      Cevapla
    36. Ertuğrul KOMUT

      Date sorunu:
      Bütün ayarlamaları yaptım. SQLServer 2005, .net 3.5..SELECT @@LANGUAGE komutu sonunda Türkçe dönüyor.
      Fakat ‘25.01.2008’ parametrik SQL lerde bile format hatası veriyor.
      hatta
      “set dateformat dmy;insert into.
      şeklinde sql yazdığım da da “String was not recognized as a valid DateTime. ” hatasını alıyorum..
      Bir türlü çözemedim.

      Cevapla
    37. Ahmet Kaymaz Yazar

      Bu hata mesajı SQL Server’in değil .NET Framework’ün fırlattığı bir hata. Sanırım .NET kodu içerisinde Datetime türünde bir değişkeni set etmeye çalışıyorsunuz. C#, VB.NET diline göre daha hassas olduğu için özellikle tarihsel, sayısal verileri dönüştürmek yordamlarını kullanmanızı tavsiye ederim. DateTime tarih = “25/01/2008¨; şeklinde tanımlanmış bir değişkeni işlemek için DateTime tarih = DateTime.Parse(“25/01/2008¨); şeklinde DateTime.Parse() yordamını kullanmanız çözüm olabilir. Eğer sorunun SQL Server’den kaynaklandığını düşünüyorsanız öncelikle Query Analyzer’de T-SQL kodunuzun doğru çalıştığından emin olun.

      Cevapla
    38. serdar

      sql serverde tablo oluşturma yöntemleri diye bi araştırma yapmam gerekiyor ama çok karışık bilgiler verilmiş google de bulamadım acaba bi yardımcı olabilirmisiniz 4-5 maddeymiş galiba şimdiden tşk ederim herkese

      Cevapla
    39. Ahmet Kaymaz Yazar

      SQL Server üzerinde tablo oluşturmak için ya T-SQL’de aşağıdaki gibi CREATE TABLE komutunu kullanırsınız ya da Enterprise Manager / Management Studio gibi görsel bir araç aracılığıyla Tables sekmesini sağ tıklayıp “New Table” menüsünden yaparsınız.CREATE TABLE "table_adi"(
      "kolon 1" "veri tipi 1",
      "kolon 2" "veri tipi 2",
      ... )

      Cevapla
    40. baris

      Ahmet bey iyi çalışmalar,
      benimde sql server konusunda bir problemim var yukarıdaki anlatılanları okudum ve uygulayabileceklerimi uyguladım ancak sonuç değişmedi sql server – ASP tabanlı bir websitem var daha önce reg. settings \\\’i TR olan (windows ve sql server için) sunucuda duruyordu. Bu durumda sitede herhangi bir tr karakter sorunu yoktu. Şu an siteyi yurtdışında bir hostinge taşımak zorunda kaldım. Hosting te sql server desteği var ancak yönetiminde bazı kısıtlamalar sözkonusu.Eposta göndererek collation değerini turkish_ci_as şeklinde değiştirttim ancak select@@language sonucu us_english olarak dönüyor. websitesinde veritabanından gelen verilerde ş -> s ı -> i şeklinde değişiklikler oluyor. Bunu asp kodundan codepage vb değişiklikler yaparak düzeltebiliyorum ancak bu durumda da veritabanından gelmeyen verilerde karakter bozulmaları oluyor. Sizden ricam bana yurtdışı sunucundaki bu sql server için hangi ayarları yapmam gerektiği konusunda yardımcı olabilir misiniz? teşekkürler
      baris

      Cevapla
    41. Ahmet Kaymaz Yazar

      Barış Bey,Eğer sorun SQL Server ile ilgiliyse bu makale zaten sorunuzun yanıtını veriyor. “Eposta göndererek collation değerini turkish_ci_as şeklinde değiştirttim ancak select@@language sonucu us_english olarak dönüyor.“. Bunu yazdığınıza göre sanırım yazının tümünü okumadınız çünkü bu makaleyle asıl anlatmak istediğim language ile collation bilgilerinin aynı şey olmadığıdır. NVarChar, NText gibi kolonlara ASP içerisinden veriyi gönderirken verinin başına N karakterini ekleyip deneyebilir misini.zINSERT tablo (sutun) VALUES (N'Türkçe Veri')

      Cevapla
    42. seha

      Ahmet bey öncelikle verdiğiniz bilgiler için teşekkür ediyorum.ticari bir yazılım kullandığımız programın veritabanında türkçe karakterlerle ilgili bir sorun yaşıyoruz. verdiğiniz bilgiler ışığında default dili ve database dilini türkçeye çevirdim fakat sorun devam etmekte. bir tabloda türkçe karakterler “Y?BANKASI ANT.?B”-“TAHSYL ÇEKLERY” şeklinde değişirken, bir başka tabloda “IS BANKASI TAHSIL ÇEKLERI” şekliinde hiç türkçe karakter yokmuş gibi davranıyor. bu konuda bilgileriniz paylaşırsanız memnun olurum.İsmail Seha YÜCEL

      Cevapla
    43. Ahmet Kaymaz Yazar

      Seha merhaba,öncelikle Türkçe karakter sorununun gerçekten SQL Server kaynaklanıp kaynaklanmadığını netleştirmeniz gerekiyor. Türkçe karakter veritabanının dil ayarıyla değil kolonun veri tipi ve collation değeriyle ilgilidir. İlk önce SQL Profiler aracından ticari yazılımın Türkçe karakterleri doğru göndermediğinden emin olmalısın. Ardından Query Analyzer’den tablodaki verilerin ham haline bakıp gerçekten Türkçe karakterlerin tabloda doğru durup durmadığına bakmak lazım. Eğer ticari yazılım karakterleri yanlış gönderiyorsa o tarafın düzeltilmesi gerekiyor. Eğer yazılım karakterleri veritabanına UNICODE olarak doğru gönderiyorsa o zaman SQL’deki tablodaki kolonların veri tip ve collation bilgilerini bu makalede anlatılanlara göre düzenlemelisin..

      Cevapla
    44. seha

      öncelikle cevap yazdığın için teşekkür ederim.programda 2008 verilerinde herhngi sorunumuz yok, devir işlemi yaptıktan sonra 2009 verilerinde sorunyaşadık. programın yazılım destek bölümüyle görüştüğümde bu işin zor düzeltileceğinden söz ediliyor. şüphelerimden bir tanesi devir işlemi yaptığım terminalde işletim sistemi açılırken ingilizce uyarılar veriyor ama açılınca türkçe çalışıyor. bundan kaynaklanabilir diye düşünüyorum.
      ama yazdığın makaledekileri denedim dediğim gibi bir faydası olmadı vertabanını sağ tuş özellikler yaparsam dil türkçe görünüyor.ama tablolarda veriler yukarıda yazdığım şekilde çıkmakta.yine tablolar için çalıştıracağım komutlardan örnek verebilisen sevinirim.vakit ayırıp ilgilendiğin için teşekkür ederim.seha

      Cevapla
    45. Tarık Memil

      Ahmet Bey merhaba,benim problemim biraz daha değişik
      elimde SQL 2005 server üzerinde çalışan birçok veritabanı var bunlar bir muhasebe programının veritabanları tüm COLLATE ler default olarak
      SQL_Latin1_General_CP1_CI_AS
      tanımlı. muhasebe programında verilerde herhangi bir problem yok raporlarda türkçe karakterler sorunsuz görüntüleniyorbu database ler muhasebe programına ait olduğu için ALTER ile COLLATION yapma şansım yok
      öyle yaparsam muhasebe programı verileri “?” ve değişik karakterler olarak algılıyor. ama
      bu yüzden benim sadece sorgu esnasında “SELECT ISYERI, SICILNO, TUR, ADI, SADI, CINSIYET, ADRES, DTAR, DYER, MERNISNO, UYRUGU, ASGDAHIL, ASGORAN
      FROM TBLES_COCUK
      ORDER BY ISYERI, SICILNO, TUR
      COLLATE Turkish_CI_AS”gibi bir sorgu ile karakterleri düzeltmem mümkün müdür?
      NOT:bu sorgu;
      “Msg 447, Level 16, State 0, Line 2
      Expression type tinyint is invalid for COLLATE clause.”
      şeklide bir hata veriyorşuan normal sorgularımda
      İ-Y
      Ğ-?
      Ş-?
      olarak ekrana çıkıyor
      kullandığım platform ASP.net, dil VB
      sorguda kullandığım
      REPLACE(REPLACE((REPLACE[ISYERI],’Y’,’İ’)),’?’,’Ğ’),’?’,’Ş’) AS [ISYERI]
      cümlesi de arama yaparken sorun çıkartıyor
      şimdiden teşekkürler hocam

      Cevapla
    46. Ahmet Kaymaz Yazar

      Öncelikle REPLACE satırının hata vermesinin nedeni parantez eksikliğidir. Satırı aşağıdaki gibi düzeltirsen düzelecektir.REPLACE(REPLACE((REPLACE(ISYERI,’Y’,’İ’)),’?’,’Ğ’),’?’,’Ş’) AS [ISYERI]Expression type tinyint is invalid for COLLATE clause” hatası ise ORDER BY içerisindeki TUR kolonunun tinyint türünde olmasıdır. COLLATE sadece metin tabanlı veri türleri için kullanılabilir. Anladığım kadarıyla muhasebe programı Türkçe karakterleri SQL Server’e düzgün göndermiyor. Eğer böyleyse yani veritaba “Ş” harfi “?” olarak duruyorsa o zaman REPLACE fonksiyonuyla bunları tek düzeltmelisin. Aşağıdaki gibi bir fonksiyon işini görecektir.CREATE FUNCTION TurkceKarakter(
      @Metin NVARCHAR(250)
      )
      RETURNS NVARCHAR(250)
      AS
      BEGIN
      SET @Metin = Replace(@Metin,'?', 'ğ');
      SET @Metin = Replace(@Metin, '?', 'Ğ');
      SET @Metin = Replace(@Metin,'Y', 'İ');
      SET @Metin = Replace(@Metin,'?', 'Ş');
      RETURN @Metin ;
      END

      Cevapla
    47. Tarık Memil

      öncelikle cevap için teşekkür ederim.
      replace yi buraya yanlış aktardım sanırım o sorgu hata vermiyor ben yazarken parantezi eksik yazmışım sadece bazı durumlarda bulması gerekeni bulmuyor yani sorgudan dönen verilerde problem oluyordu bende
      kendime göre arama yaptırdığım kutu içerisindeki
      kelimeleri arama yapmadan önce
      İ-Y
      Ğ-?
      Ş-?
      olarak değiştirerek sorguya soktum yani ters mantıktan gittim arama problemim kalmadı
      collate olayına gelince ben sorguda genel anlamda bir collate kullanamıyormuyum yani tüm sorgudaki string veriler için geçerli olacak bir collate?
      yani
      “SELECT ISYERI COLLATE Turkish_CI_AS, SICILNO, TUR, ADI COLLATE Turkish_CI_AS, SADI COLLATE Turkish_CI_AS, CINSIYET, ADRES, DTAR, DYER, MERNISNO, UYRUGU, ASGDAHIL, ASGORAN
      FROM TBLES_COCUK
      ORDER BY ISYERI, SICILNO, TUR”şeklide field bazında mı collate kullanmam gerekiyorson olarak yazdığınız fonksiyon veritabanı üzerindeki bilgileri kalıcı olarak mı değiştiriyor yoksa sadece sorgu esnasında ekrana getirdiği verilerimi değiştiriyor
      çünkü dediğim gibi kalıcı bir değişiklik yapamıyorum ozaman muhasebe programı etkileniyor

      Cevapla
    48. Canan Oruç

      Merhaba Ahmet Bey,Herşeyden önce bilgi paylaşımınız için teşekkür ederim.
      Benim sormak istediğim şey ayni tabloda hem Latin hem Cyrilic collation tanıtabilirmiyiz.
      Amacım ayni tabloda hem türkçe hem rusça karakterleri tutmak ve onları doğru yazıp okutmak.Syg.

      Cevapla
    49. Ahmet Kaymaz Yazar

      Collation tablo bazında değil kolon bazında bir özellik olduğu için kolon seviyesinde işlem yapılabilir. Verdiğim fonksiyon dışarıdan aldığı metindeki karakterleri düzeltip Türkçeleştirilmiş halini döndürür. Fonksiyonu kaydedip SELECT dbo.TurkceKarakter(“a?”) diye yazarsanız sonuç olarak “ağ” ifadesi döner. Bunu WHERE, SELECT, UPDATE gibi herhangi bir yerde kullanabilirsiniz.

      Cevapla
    50. Ahmet Kaymaz Yazar

      Sayın Oruç,aslında sorunun yanıtı mesajlarda mevcut :) . Şöyle anlatayım; Collation bilgisi tablo değil kolon seviyesinde bir özelliktir. Sorunu aynı kolonda hem Türkçe hem de Rusça karakterleri yazdırabilir miyiz diye düşünüyorum. Kolonun tipi char türündeyse o kolondaki collation bilgisi önem kazanmaktadır. Yani sadece collationa uyan değerler atanabilir. Örneğin char tipindeki kolonun collation değeri Turkish_CI_AI ise buraya Rusça karakterler ???? şeklinde saklanır. O yüzden bu kolonu Cyrillic_General_CI_AI olarak değiştirmek daha doğru olacaktır. Fakat kolonun tipi nchar, nvarchar gibi unicode destekli olursa çoğu zaman kolonun collation bilgisi önemli olmayıp tüm encoding karakterleri saklanabilir. Tabi burada dikkat edilmesi gereken konu SQL Server’e verileri atarken national character olarak bilinen “N” önekiyle aktarılması gerekir. Yani INSERT Table1 VALUES(N’?????????????’) şeklinde olmalıdır.

      Cevapla
    51. harun

      merhaba ahmet bey Query ye SELECT SERVERPROPERTY(‘collation’)
      sorgusunu çalıştırdığımızda SQL_Latin1_General_CP1_CI_AS
      değerini veriyor.Bunun Türkçe karakterlerde sorun çıkarmaması için Latin5 olması gerekir diye bir tavsiye aldık bu sorunu nasıl çözebiliriz acaba acemiye göre anlatırsanız minnettar kalırım saygılar

      Cevapla
    52. Ahmet Kaymaz Yazar

      Harun Bey,mutlaka şu collation olacak diye bir durum bulunmamaktadır. Önemli olan veritabanınızın veri tiplerini düzgün yapmalısınız. Bunun için de bu makale ve yorumları sizi doğru yönlendirecektir. Türkçe karakter için SQL_Latin1_General_CP1254_CI_AS veya Turkish_CI_AS değerlerini seçip devam edebilirsiniz.

      Cevapla
    53. harun özden

      Cevap için teşekkürler ahmet bey inanın bir çok arştırmama rağmen anca sizde yanıt bulbildim peki SQL_Latin1_General_CP1254_CI_AS veya Turkish_CI_AS değerlerini naıl belirlyoruz var olan bir veritabanı üzerinde bu değişiklği nasıl yaparız Saygılar..

      Cevapla
    54. Ahmet Kaymaz Yazar

      Harun Bey,makalenin tümünü okumadığınızı düşünüyorum :) . Ayrıca 3.yorum sorunuzun yanıtını veriyor.
      Eğer mevcut bir kolonun collation değerini değiştirmek istiyorsanız bunu design bölümünden veya ALTER TABLE komutuyla T-SQL aracılığıyla yapabilirsiniz. Aynı şekilde veritabanının collation değerini değiştirmek için 3.yorumda anlatıldığı gibi ALTER DATABASE komutunu kullanabilirsiniz.
      Şunu unutmamalısınız; Database’in collation değerini değiştirmeniz mevcut tablolardaki kolonların collation değerini database default olarak değerlenmiş olsa bile etkilemez. Sadece bundan sonra oluşturacağınız kolonlar için database default seçili olduğu zaman yeni collation değeri atanır.

      Cevapla
    55. inanç

      Merhaba Ahmet Bey,
      Saat şu anda sabaha karsi 3:30 gibi ama ben hala sorunumu cözemedim ve burada 2-3 ay once kesilmis bir tartisma gördüm.Ben de gösterdiginiz ilgiden cesaret alarak bir soru sormak istiyorum.DotNetNuke ile çalışıyorum.Dotnetnuke kurulumu icin Latin1_General_CI_AS
      collation olarak gerekli. Bu yüzden kacamadigim sorgularimda SQL = “Select FIRMAADI,FIRMAID,BOLGEKODU From firma Where BOLGEKODU=1 and FIRMAADI LIKE N'” + prefixText + “%’ collate Turkish_CI_AS Order By FIRMAADI”;
      gibi sorgular yapiyorum. Ama kod nerede ise yazıldı ve bitti. Sorunun maalesef sonra farkına varabildim. Prosedürlerimi değiştirmem gerekiyor.ALTER PROCEDURE [dbo].[teklifAra]
      @BolgeKodu int,
      @FirmaAdi varchar(40)=null,
      @TeklifNo varchar(10)=null,
      @TeklifTar smalldatetime=NULL-EXECUTE teklifAra @FirmaAdi = N’Ba’,@BolgeKodu=1,@TeklifNo=null,@TeklifTar=’19000101′
      AS
      BEGIN
      SET NOCOUNT ON;
      SELECT [ID]
      ,[YIL]
      ,[FIRMA]
      ,[FAX]
      ,[MUSTNO]
      ,[TEKLIFTAR]
      ,[TEKLIFNO]
      ,[CIHAZADI]
      ,[OLCUMARALIGI]
      ,[KALYERI]
      ,[OLCMETODU]
      ,[BIRIMFIYAT]
      ,[ADET]
      ,[TOPLAMFIYAT]
      ,[TAHKALSURESI]
      ,[NOTLAR]
      ,[ILGILI]
      ,[ILGI]
      ,[ILGLAB]
      ,[ONAY]
      ,[TEKLIFSIRASI]
      ,[BASILDI]
      ,[BOLGEKODU],[ISTID] from teklif where
      BOLGEKODU=@BolgeKodu
      and ((@TeklifNo is null) or (TEKLIFNO like ‘%’ + @TeklifNo+’%’ ))
      and ((@TeklifTar=’1900.01.01′) or (TEKLIFTAR = @TeklifTar))
      and ((@FirmaAdi is null) or (FIRMA like ‘%’ + @FirmaAdi+’%’ ))
      -and ((@FirmaAdi is null) or (FIRMA like ‘%[N’ + @FirmaAdi+’]%’ COLLATE Turkish_CI_AS ))
      ENDhemen burada örnek bir tanesini verdim. Like için parametre aktarırken N prefix i nasıl kullanılabilir acaba?Bu sorunun üstesinden maalesef gelemiyorum.Teşekkur ederim

      Cevapla
    56. Ahmet Kaymaz Yazar

      Merhaba İnanç,kodun hepsini incelemedim ancak Unicode işlemin doğru çalışması için şunlara dikkat etmelisin;Teklif tablosundaki FIRMA gibi kolonların Unicode türü veri tiplerine (nchar,nvarchar,ntext) sahip olmalı.teklifAra isimli procedure içerisindeki @FirmaAdi parametresinin de Unicode olarak tanımlanmış olması gerekir. Yani FirmaAdi varchar(40)=null satırını FirmaAdi nvarchar(40)=null olarak değiştirelim.Son madde olarak bu procedure’in çağrıldığı yerde de veriyi N ile göndermek lazım. Yani EXEC teklifAra @BolgeKodu=1,@FirmaAdi=N’ABC’,@TeklifNo=123,@TeklifTar=’01/06/2009’Procedure içerisindeki parametreleri ve dışarıdan gönderilen değerleri Unicode olarak tanımladıktan sonra procedure içerisindeki LIKE alanlarına N yazmak gereksiz olacaktır. Tersinden düşünecek olursak parametreler Unicode olmadığı sürece içeride N kullanmış olmanın faydası olmayacaktır. LIKE alanlarındaki N’leri kaldırabilirsin.Kolay gelsin,

      Cevapla
    57. inanç

      Merhaba Hocam,
      Ben dün gece nerede ise hiç uyumadim..evet varchar yerine nvarchar kullaninca sorun çözüldü..varchar ve nvarchar arasinda ne fark var diye düşünüp duruyordum.Öğrendim! Ama ucuza olmadı. Siz çok kısa ve güzel biçimde açıklamışsınız. Beni gerçek bir sıkıntıdan kurtardınız.İçtenlikle teşekkür ediyorum..

      Cevapla
    58. Cem IŞIK

      Abi Tek Kelime Hayran Kaldım.2007 den bu yana herkese cevap yazmışın.Helal.Aslında Cevabını Yüz kere yazmışındır yukarıda ama bulamadım.
      veritabanım SQL_Latin1_General_CP1_CI_AS
      adsoyad diye bi alanım var orda “Cem Işık” yazıyor.
      Ne yaptımsa vb.net te sorguyla getiremedim o alanı.
      select * from tabloadi where adsoyad=’Cem Işık’ olmuyor yani.
      19 numaralı cevabına göre yaptım sonuç alıyorum ama benimde içime sinmiyor şöyle bi sorgu.select * from tabloadi where adsoyad collate French_CI_AI=’Cem Işık’veritabanını Turkish_CI_AS felan yapamıyorum çünkü Netsis veritabanından Viewlere bilgi alıyorum.
      Netsisde SQL_Latin1_General_CP1_CI_AS.Ne yazarsam onu gösterecek şekilde nasıl bi uyarlama yapabilirim acaba?

      Cevapla
    59. Ahmet Kaymaz Yazar

      select * from tabloadi where adsoyad=’Cem Işık’ cümlesindeki adsoyad kolonunun collation değerini yazmış olsaydın daha iyi yardımcı olabilirdim. Eğer o kolonun collation değeri SQL_Latin1_General_CP1_CI_AS
      ise herhangi bir sorun olmaması WHERE ile birlikte collate kullanmana gerek kalmadan doğru çalışması gerekeir. French_CI_AI değerinin ne ilgisi var.

      Cevapla
    60. Cem IŞIK

      Sorumu tekrarlıyım o zaman.
      Veritabanı : SQL_Latin1_General_CP1_CI_AS
      Tablo : SQL_Latin1_General_CP1_CI_AS
      adsoyad: database defaultBaglanti Cümlesi : Provider=SQLOLEDB;password=*****;User ID=sa;Data Source=serveradi; Initial Catalog =tabloadi;Persist Security Info=True;Auto Translate=False;Sorgu : select * from tabloadi where adsoyad=’Cem Işık’;
      Sonuç : boş
      Ama Sorgu : select * from tabloadi where adsoyad collate French_CI_AI=’Cem Işık’;
      olursa
      Sonuç : Cem Işık

      Cevapla
    61. Ahmet Kaymaz Yazar

      Bu sorguları SQL Server Query Analyzer’da çalıştırdığın zaman tablodaki değerin gerçekten ne olup olmadığına bakmak lazım. adsoyad kolonunun unicode veritipine (nchar,nvarchar) sahip olduğunu düşünerek “Cem Işık” değeri bu yapıda unicode olarak kayıt edilmemişse “Cem Isik” olarak görünüyor olabilir. adsoyad kolonunun unicode veritipine sahip olduğunu düşünerek select * from tabloadi where adsoyad=’Cem Işık’yazdığınızda “Cem Isik” kaydının geliyor olması lazım. Doğrudan “Cem Işık” getirmesi için N önekini kullanmalısınız.select * from tabloadi where adsoyad=N’Cem Işık’Eğer bu sorgu da onu getirmiyorsa yapacak birşey yok sanırım. Bu arada bu kayıtların INSERT tabloadi VALUES (N’Cem Işık’) olarak kayıt ediliyor olması gerekmektedir.

      Cevapla
    62. Orkun Türk

      Ahmet Bey
      Paylaşımınız oldukca güzel sizden bir ricam olucaktı yakın zamanda SQL SERVER 2005’te Crystal Report’un nasıl çalıştıgını paylaşırsanız cok sevineceğim.şimdiden teşekkürler Orkun.

      Cevapla
    63. GÜRCAN

      merhaba sql server 2008 actıgımda sunucu adı üzerinde sağ tuş proportions dediğimde general bölümünde server colletion var orda kurulurken latin şeçilmiş ve ben onu nasıl türkçe yaparım acaba. kurulumda defeult dıl ayarı bu SQL_Latin1_General_CP1_CI_AS
      ben bunu dırek olarak Turkish_CI_AS yapmak istiyorum nasıl yaparım acaba

      Cevapla
    64. kerim

      hocam neden phpde 1i silince yeni yazılan şey 1e deilde yeni bi rakama yazılıo yada neden 1i silince sıralama kaymıyo

      Cevapla
    65. Ahmet Kaymaz Yazar

      Kerim, keşke seni anlayabilseydim. Sanırım identity değerli bir kolondan bahsediyorsun. Bu tür kolonlarda daha önce verilmiş değer yeniden verilmez. Ancak manual bir şekilde öteleme veya sıralamayı yeniden düzenlemek lazım.

      Cevapla
    66. Orkun

      Merhaba Ahmet Bey
      ben sql 2000 kullanmaktayım. dbm de ılgın diye alınan bir üyelik ilgin olarak görünmekte ancak ilgin ve ılgını ayrı ayrı kayıtta olmasını istiyorum. ılgın diye kaydetsem dahi dm ye ilgin olarak kaydolmakta. dil : latin1_general_cp1_CI_AS durumunda. Hangi dile çevirmem gerekir ki ılgın ve ilgin iki farklı kayıt olabilisin. Teşekkürler

      Cevapla
    67. Göktuğ Akçay

      Öncelikle Bu mükemmel içerikler için size teşekkür etmek istiyorum Ahmet Bey .. Gerçekten çok yardımcı oldu bana bu bilgiler bu işte tecrübeli değilim bilmediğim öğreneceğim çok şeyler var daha . benim sorum şu olucak size ;Bir sitemin veritabanına sunucusunda olan sıkıntılardan dolayı sürekli ulaşamıyorduk ve site sürekli kapanıyordu ve sunucusunu değiştirdi hosting firması ve yeni sunucuya taşıdılar bende siteyi yeni sunucunun ip leri ile güncelledim ve veritabanını ordan çekiyor şimdi fakat ekleme güncelleme gibi işlemler yapacağım zaman veritabanına şöyle bir hata veriyor ..Microsoft OLE DB Provider for ODBC Drivers error ‘80004005’ [Microsoft][ODBC SQL Server Driver][SQL Server]Could not find server ‘SQL2005-01’ in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers. icerikEklendi.asp, line 105 Line 105 >> rsAdmin2.update()ilgili kodlar ;set rsAdmin2 = server.createobject(“ADODB.recordset”)
      rsAdmin2.open “H_DUYURU”, adoCon, 2, 2Bu hatanın anlamı nedir acaba yardımcı olabilirmisiniz ?

      Cevapla
    68. Göktuğ Akçay

      Ahmet bey sizden bir konuda daha yardım isteyeceğim şimdiden teşekkür ederim yardımlarınız için ..yine aynı sitenin veritabanının sunucusunda sorun oluştu ve sunucu değiştikten sonra yeni sunucuya geçince sitede veritabanından çekilen resimlerde sorun oldu resimler görünmüyor ama görünmeyen resimler adında türkçe karakter olan resimler ( İ,Ş ve Ğ ) olan resimler veritabanında örneğin ALİİĞDE.jpg olarak kayıtlı bu resim sitede önceden görünüyodu fakat sunucuda sorun olduktan sonra resimler görünmemeye başladı zağ tıklayıp resimin yolna baktığımda ALIIGDE.jpg olarak bakıyor veritabanına ve bulamayınca göstermiyor haliyle . veritabanının Collation ‘ u Turkish CI_AS
      sunucunun Collation ‘ u SQL_Latin1_CP1_CI_AS bu sorun için nasıl bi çözüm öneriniz var acaba ahmet bey ?

      Cevapla
    69. Ahmet Kaymaz Yazar

      Orkun merhaba,Bu duruma tablonun collation değerinin SQL_Latin1_General_CP1_CI_AS olmasından kaynaklanmamaktadır. Bu collation ılgın değerini ilgin yapmaz. Veritabanına kayıt eden programda bir sorun var bence. Doğrudan Query Analyzer’de INSERT ile tabloya “ılgın” değerini yazmayı denedin mi.

      Cevapla
    70. Ahmet Kaymaz Yazar

      Göktuğ,il sorunun yanıtı sanırım SQL Server üzerinde bir linked server / remote server kurmuşsunuz. Adı “SQL2005-01¨ olan bu uzak sunucuya erişemiyor.2.sorunun yanıtı için şunu söyleyebilirim;sunucu veya db’nin collation değerinden ziyade verinin bulunduğu tablonun collation değeri önemlidir. sp_help TabloAdi olarak sorgularsan oradaki kolonları ve collation değerlerini listeler. Sözkonusu resim kolonunun collation değeri Turkish_CI_AS ise hiçbir sorun çıkmaz. Query Analyzer ile SELECT cümlesini çalıştırdın mı. Orada da Türkçe karakter sorunu var mı. Eğer yoksa ASP.NET’te ayarlardan kaynaklanıyordur. Ya da zayıf bir ihtimal taşınma esnasında veri bozuldu.

      Cevapla
    71. Deniz Kuran

      Merhaba Ahmet Bey, öncelikle makaleleriniz için teşekkürlerimi dile getirmek istiyorum. Ben şöyle bir sıkıntı ile karşı karşıyayım. ASP ile hazırladığım web uygulamalarında database bağlantılarını (SQL 2000) global.asa içerisinde sağlamıştım. SQL 2000’e web üzerinden bağlantı kurmak için “webuser” adında bir SQL kullanıcısı yaratmıştım. Bu kullanıcının “Default Language” değerini ise “turkish” olarak belirledim. IIS root klasöründe test.asp içerisine “response.write(Session.LCID)” satırını yazıp ekrana değerini bastırdığım zaman 1055 değeri geliyor. Buradan SQL’e bağlantıyı “Türkçe” olarak yaptığımı anlıyorum. Buraya kadar bir sıkıntım yok. Tüm uygulamalarım düzenli bir şekilde çalışıyor. Fakat bu aralar sistemimi SQL 2005′ e geçirmek istedim. Aynı database kullanıcısını SQL 2005 üzerinde tekrar yarattım ve Default Language değerini turkish olarak belirledim. Ama bir türlü database bağlantısını türkçe olarak sağlayamadım. Test için yarattığım test.asp dosyasında LCID değerini ekrana yazdırdığım zaman 1033 çıkıyor. Böyle olunca da cdate() hataları alıyorum. Aynı sistem üzerinde SQL 2005’i silip tekrar SQL 2000’i kurduğum zaman sorun olmuyor. SQL 2005 üzerinde bu kulanıcının turkish değeri ile bağlantı kurmasını nasıl sağlayabilirim? “ALTER LOGIN webuser WITH DEFAULT_LANGUAGE = Turkish” ifadesi ile de güncelleme yaptım. Sonuç aynı.Bu konuda yardımcı olursanız sevinirim. Şimdiden teşekkürler.

      Cevapla
    72. Ahmet Kaymaz Yazar

      Deniz,CDate() fonksiyonu VBScript ile ilgili olup SQL ile herhangi bir ilişkisi olmadığı için sorun SQL Server’den değil Web sunucudaki ayarlardan kaynaklanmaktadır. Sayfanın başına Session.LCID = 1055 satırını eklerseniz o oturumdaki yerel ayarların Türkçe olacağını düşünüyorum.

      Cevapla
    73. Deniz Kuran

      Teşekkür ederim cevabınız için Ahmet bey.Sorunu söylediğiniz şekilde halledebilirim. Ama kafamı kurcalayan şu. SQL Server üzerinden oturum açan kullanıcının dilini yukarıda anlattığınız şekilde “Default Language” ile belirliyoruz. Ve yarattığımız bu kullanıcıyı Connection String’te kullandığımız zaman SQL’e bu kullanıcının “Türkçe” dil ayarları ile bağlanacağını söylemiş oluyoruz yanılmıyorsam. Bu da, bu oturumdan gelecek tarih, para vb. değerlerin SQL tarafından hangi formatta algılanacağını belirtiyor. Dolayısıyla CDATE fonksiyonu ile ben veritabanına gg.aa.yyyy formatında bir değer gönderdiğim zaman SQL üzerinde oturum açan kullanıcının dili “Türkçe” olduğu için SQL bu formata göre işlem yapacaktır. Buraya kadar umarım doğru yanılmıyorumdur. Bu sorun SQL 2000’de olmuyor. Çünkü veritabanına bağlantı kuran kullanıcının dili türkçe. Ve ben web üzerinden CDATE() ile fonkiyonu ile gg.aa.yyyy olarak tarih gönderdiğimde SQL bu değeri sorunsuz bir şekilde update ediyor. Ama SQL 2005’de aynı kullanıcıyı türkçe dil değeri ile yaratıp bağlantı kurduğumda, CDATE() ile gg.aa.yyyy formatında tarih gönderdiğimde SQL bu kullanıcıdan gelecek tarih değerini türkçe beklemiyor, ingilizce bekliyor. Yani aa/gg/yyyy olarak beklediği için sistem burada sorun yaratıyor. Çünkü ben hiç bir sayfamda LCID tanımı yapmadan SQL 2000 ile sorunsuz bir şekilde çalışıyorum. Büyük bir ihtimalle SQL 2005’te yarattığım bu kullanıcının dil ayarlarında bir sorun var.

      Cevapla
    74. Ahmet Kaymaz Yazar

      Sözkonusu connection string ile “SELECT @@LANGUAGE” ifadesini çalıştırdığınızda “Türkçe” değeri dönüyorsa aşağıdaki formatlarda bugünün tarihini girebilirsiniz.INSERT Table(Tarih) VALUES(‘22.01.2010’)
      INSERT Table(Tarih) VALUES(’22/01/2010′)
      INSERT Table(Tarih) VALUES(’22-01-2010′)Bence ASP’de oluşturduğunuz SQL cümlesini ekrana yazdıran veya SQL Profiler aracıyla SQL Server’e tam olarak nasıl bir ifadenin gittiğine bakınız. Eğer veritabanına bağlı olduğunuz kullanıcının varsayılan dil ayarından emin değilseniz kullanıcının o anki oturumunda geçici olarak dili değiştirmek için SET LANGUAGE anahtarını kullanabilirsiniz.

      Cevapla
    75. murat

      ahmet bey oncelikle aciklayici bilgileriniz icin cok tesekkurler.Ahmet bey bir soru sormak istiyorum.
      mssql server turkish collation ve turkish database ayarlari ile bir program kullaniyordum.program surum yenileyince sql in yedegini alip restore ettim.fakat programin yeni surumunde servera latin dil ayarlari ile yukleme yapılması gerekiyormus.yani mssql server collation latin olmali.aksi takdirde calistirmiyor.simdi ben daha onceki databasemi yeni sürüm convert edemedigi icin calistiramiyorum.latini turkce collationa ceviremiyor.bana bu konuda yardimci olabilirmisiniz.
      Selamlar.

      Cevapla
    76. Ahmet Kaymaz Yazar

      O zaman elindeki veritabanını restore edip veritabanının collation değerini istediğin şekilde değiştirebilirsin. Ardından programa bu yeni restore edilmiş veritabanını gösterirsen işlem düzelir diye düşünüyorum.

      Cevapla
    77. Elif Alev

      Merhaba,Ben azeri latin harfleriyle datalar girmek istiyorum,sql server 2005 kullanıyorum, Azeri_Latin_90_CI_AS collation’ı set edilmiş ve tüm stringler nvarchar() olmasına rağmen yabancı olan tek harfi(azerinin türkçeden tek farklı harfi var) ? olarak görüyorum.Yardımcı olabilirseniz çok sevinirim teşekkürler..

      Cevapla
    78. Ahmet Kaymaz Yazar

      Verileri unicode olarak girmeniz yani değerin başına N eklemeniz gerekmektedir. N’????’ gibi.

      Cevapla
    79. Baris

      Merhaba,
      azeri dilinde kullanılan “?” karekterini insert ile tabloya insert ettiğimde “?” olarak yapıyor.Database collation ı Azeri_Latin_90_CI_AS olmasına rağmen bu neden kaynaklanıyor olabilir?

      Cevapla
    80. sunay

      Merhabalar,
      Bi konuda bilgi ve tecrubinize ihtiyacim var. Yardimci olursan cok cok sevinirim. Oracle’da calistigimiz icin MSSQL serveri cok iyi bilmiyorum. Yurtdisinda bulunan bir MSSQL serverdan kiril alfabesinde veri cekmek gerekiyor.
      Oncelikle ODBC kullanarak dblink yarattim. Latin ve sayisal degerleri okumamda bir sorun yok. Fakat kiril karakterlerini select ettigimde ???? seklinde cikiyor. Ne yapmam gerektigi konusunda yardimci olursaniz sevinirim.

      Cevapla
    81. Ahmet Kaymaz Yazar

      Sunay,SQL Server’de veri nasıl hangi veri türünde saklanıyor. Araya ODBC veya başka bir uygulama koymadan doğrudan SQL Server Query Analyzer’den okumakta fayda var. Eğer orada doğru görünüyorsa ODBC veya kullanıcı tarafındaki uygulamada sorun olabilir.

      Cevapla
    82. sunay

      son yazima istinaden birsey daha eklemek istiyorum;”toad for sql server” veya “sql manager studio” gibi yazilimlarla sql server’a baglandigimda kiril karakterlerini sorunsuz gorebiliyorum. ODBC kullanmadan sql manager studio kullanarak sql server’dan “linked server” yaratarak mi verileri oracle’a gondermeliyiz? Tesekkurler

      Cevapla
    83. Ahmet Kaymaz Yazar

      Karakterleri sorunsuz görebiliyorsanız o zaman ODBC veya verileri gösterdiğiniz uygulama tarafında (Windows/Web) codepage veya encoding ayarlarını yapmakta fayda var.Eğer amaç Oracle’a veri göndermek ise bunu DTS (SSIS) ile yapmak daha mantıklı olabilir. Veri az ise Linked Server ile de olabilir.

      Cevapla
    84. Murat Ayaz

      Ahmet hocam,
      Belki konu ile alakasız ancak email adresinizi bulamadigim için buraya yazmak zorunda kaldım,Sql server 2008 shrink işlemi yapmama lazım log dosyasi yaklasik 20 GB gibi oldu, Bunu wizard üzerinden yaptigimda, log dosyasının boyutunda hiç bir sekilde azalma olmuyor,Yardımlarınızı rica ediyorum

      Cevapla
    85. Ahmet Kaymaz Yazar

      Murat,aşağıdaki komutile bu işlemi yaptıktan sonra bu değerin düşmesi lazım. DBCC SHRINKDATABASE(N’Veritabanı Adı’, 10, TRUNCATEONLY)Eğer düşmezse servisi yeniden başlatmanda fayda var. Bu arada eğer veritabanının “Recovery Model”i Basic değilse LOG dosyası çok düşmeyebilir.

      Cevapla
    86. İLKER ARSLANTÜRK

      Ahmet bey merhaba. Bütün Türkiye sizden yardım istiyor. İlave olarakta ben isteyeceğim.Durum şu. Şimdi bir servis sağlayıcıdan bir müşterim plesk panelden veritabanı create ediyor. Fakat ayarımız Turkish_CS_AI olmadığı için ne aramalarda sonuç elde edebiliyoruz nede karakterler düzgün çıkıyor. Servis sağlayıcı ile görüştüm ama çok anlamadığım birşeyler dediler. Google’da arama yaparken misafir oldum size. Ben yukarıdaki “SELECT name, collation_name FROM sys.databases” yazdığımda Collation_name olarak SQL_Latin1_General_CP1_CI_AS görüyorum ve veritabanımın içerisinde ne kadar tablonun varchar alanı varsa Turkish_CS_AI olarak değiştirmek istiyorum. Çünkü büyük “IİŞÇÖÜĞ” küçük “ıişçöüg” ile aynı sonucu döndürmeli.Birde pleskten hatalı olduğu için veritabanının yedeğini alamıyoruz ve yapacağımız işte hata yapma şansımız yok. Birde bu işi SQL sorguları ile yapmak istiyorum. Çünkü başka müşterilerimizdede aynı problem olursa birkaç saniyede çözüme kavuşmak istiyoruz.Not : Yazdığım bir programla veritabanına ado ile direk erişim yapıp tablolarımı listboxta listelebiliyorum ve SQL sorgusu çalıştırabiliyorum.Yardımlarınız için şimdiden teşekkürler.Saygı ve sevgilerimle

      Cevapla
    87. Ahmet Kaymaz Yazar

      Merhaba İlker Bey,alanların collation değerini “Turkish_CS_AI” yapmanız durumunda WHERE Kolon=’IÖÇŞİĞÜ’ sorgusu için hem “IÖÇŞİĞÜ” hem de “ıöçşiğü” değerlerinin geleceğini sanmıyorum. Bunun için Turkish_CI_AS yapmanız daha doğru olacaktır diye düşünüyorum. Buna karar verdikten sonra tüm tablolar için tüm alanları değiştirmek için 5.yorumdaki açıklamamı referans alabilirsiniz.

      Cevapla
    88. İLKER ARSLANTÜRK

      Tekrar merhaba Ahmet Bey,Dediğiniz gibi “Turkish_CS_AI” olarak kullanmıyorum artık. “Turkish_CI_AS” çok mantıklı. Bundan sonra bende böyle kullanıcam. Makaleniz çok faydalı oldu. Teşekkür ederim.Hakkınızı Helal Edin.

      Cevapla
    89. Tufan Cakiroglu

      Merhaba benim bir databasemin dil kodu SQL_Latin1_General_CP1254_CI_AS. Fakat cin karakterlerini de database icerisinde atmak istiyorum galiba bunun tek yolu sql insert cumleciginin basina N koymak.Boylece database o textin unicode oldugunu anliyor. Fakat benim sorum mysql”deki gibi direk utf-8 database olusturamaz miyiz ?. Yani herhangi bir isleme gerek kalmadan database collection degerini yada charset degerini utf-8 seklinde ayarlamanin bir yolu var mi ? Tesekkur ederim

      Cevapla
    90. Ahmet Kaymaz Yazar

      Tufan,SQL Server’in gelen verinin unicode olduğunu anlaması için başına “N” eklemek zorundasın.

      Cevapla
    91. Ferhat

      ahmet hocam şuan bir sözlük yapıyorum vb.nete access veri tabanını kullanarak veriyi okutuyorum sözlüğümde latin harflerin normal türkçe hafri gibi okutulmasını istiyorum bunu nasıl yapabilirim yardımcı olursanız minettar kalırım.

      Cevapla
    92. Leo

      Merhaba,
      azeri dilinde kullanılan “?” karekterini insert ile tabloya insert ettiğimde “?” olarak yapıyor.Database collation ı Azeri_Latin_90_CI_AS olmasına rağmen bu neden kaynaklanıyor olabilir?

      Cevapla
    93. Ahmet Kaymaz Yazar

      Leo,17.mesajda detayını anlattığım gibi değerlerin başına “N” harfini eklemek sorunu çözecektir.

      Cevapla
    94. Leo

      değerlerin başına “N” harfini eklemek sorunu çözmedi bir qeder etrafli aciq bir cavab yazsaydiz cox sad olardim

      Cevapla
    95. ata

      Merhaba,
      Türkçe karakterler ile ilgi bir problemim var yardımlarınız için şimdiden teşekkürler.
      MSSQL 2008 Server Collation “SQL_Latin1_General_CP1_CI_AS” olarak kurulu.
      Databese collation ayarlarını değiştirme şansımız bulunmamakta. Bu yüzden column bazında “Turkish_CI_AS” kullandık.
      Denemelerimiz ve aldığımız sonuçlara döner isek;
      Table_1
      T1 nvarchar(50) “SQL_Latin1_General_CP1_CI_AS”
      T2 nvarchar(50) “Turkish_CS_AI”
      T3 nvarchar(50) “Turkish_100_CI_AS”Insert Table_1
      Values
      (‘Iı – İi – Şş – Ğğ’,
      ‘Iı – İi – Şş – Ğğ’,
      ‘Iı – İi – Şş – Ğğ’ )Aldığım sonuç
      T1 Ii – Ii – Ss – Gg
      T2 Ii – Ii – Ss – Gg
      T3 Ii – Ii – Ss – Gg ikinci deneme
      Fakat Management Studio üzerinden Table Edit modunda
      her 3 column’a da “Iı – İi – Şş – Ğğ” girişi yapıyorum.
      aldığım sonuç :
      T1 Iı – İi – Şş – Ğğ
      T2 Iı – İi – Şş – Ğğ
      T3 Iı – İi – Şş – ĞğBu sorunu insert işlemi sırasında nasıl aşabilirim?Teşekkürler.

      Cevapla
    96. ata

      Merhaba, Yukarıda kaçırdığım bir nokta olmuş değerlerin başına N ekleyince sorunum düzeldi. Teşekkürler.

      Cevapla
    97. Gkhn

      Merhaba
      Sql’e kaydedilen rusça veriler turkçe karakterde gorunuyor
      tekrar select ederken nasıl rusça karakterler ile alırız
      yardımınız için teşekurler.

      Cevapla
    98. rufi

      merhabalar,vps server ıma sql 2012 kurulumu yapacagım. Fakat sorum sudur ki sadece turkce database ile islem yapmıyorum. son proje de ingilizce fransızca almanca turkce ( belki bir kac dil daha )girisleride olacak database kayıtlarında, bu nedenle sanırım TURKISH_ CI_AS secmemeliyim. SQL_Latin1_General_CP1_CI_AS collation secmem kurulumda daha mı dogru olur ?saygılarımla

      Cevapla
    99. Laplace

      Abi eline sağlık. İnanılmaz derecede işime yaradı. Bu kadar kullanışlı bilgiler bu kadar temiz ve net ifade edilebilirdi. Teşekkür ederim.

      Cevapla
    100. Laplace

      Ben birden fazla client ın aynı anda ortak veritabanına access edeceği bir proje üzerinde çalışıyorum. Client yazılımının içine veritanı collation ayarını değiştiren sorguyu gömersem, bir clientın veritabanını single moda geçirmesi diğer clientlerın bağlantılarını koparacaktır tahminime göre. Burda sormak istediğim tekrar multi moda geçirdiğimde diğer bağlantılar kaldıkları yerden çalışmaya devam edebilirlermi?

      Cevapla
    101. Ahmet Kaymaz Yazar

      Laplace,bence collation değerini client üzerinden değil de doğrudan sunucu üzerinden yapman daha doğru olacaktır. Yine de bu şekilde bir çalışma yapmak istiyorsan istemci tarafı sunucunun modu değiştikten sonra kaldığı yerden devam edebilir. Ancak connection kesileceği için yeni bir connection nesnesi oluşturacaktır.

      Cevapla
    102. bulent

      Merhaba hocam;mssql destegi vermeye calistigimiz programimizda asagidaki linkteki problemle karsilastik:
      http://connect.microsoft.com/SQLServer/feedback/details/382858/field-names-becomes-case-sentive-when-we-use-turkish-ci-as#sanırım henüz microsoft bu bug ile ilgili fix cikartmamis (workaround bolumunde bahsedilen cozumlerde “İ” karakteri “I” olarak tabloya giriyor ve isimizi gormuyor). bu sorunu asmak icin sql cumleciklerinin hepsini elden gecirmekten baska bir yontem varmidir?tesekkurler.

      Cevapla
    103. Ahmet Kaymaz Yazar

      Merhaba Bülent,SQL Server’de Turkish_CI_AS collation türündeki bir veritabanında nesne isimlerinde “i” ile “I” eşit olmadığı için tüm sql cümlelerini gözden geçirmek dışında bir yöntem aklıma gelmemektedir.

      Cevapla
    104. Hakkı Kalay

      Çok güzel bilgiler.. Çok teşekkür ederiz. Bir sorum olacak hocam.. Sql data base de 3. açtığım data da tarihle ilgili bir sıkıntım var. Asp proğramında yazdığım select önüne diğer iki data base de koyamdığım SET DATEFORMAT dmy koyunca data tarihini gün/ay/yıl olarak kabul ediyor. Diğer iki data da bunu yapmadığım halde sorun olmuyor. SQL bu formatı excute ettiğim halde olmuyor. Yardımlarınızı bekliyor saygılar sunuyorum.

      Not: 3 data ay/gun/yıl şeklinde girersem kabul ediyor.. Saygılarımla

      Cevapla
    105. muhittin

      ben c# tan bi proje aldım projemde fotograf cekme var ama sql ile baglantısı var nasıl yapacagımı bılmıyorum bana yardım

      Cevapla
    106. Deniz Yıldızı

      Ahmet bey, benimde
      Karekter set sorunum; çözümde anlattığınız;
      INSERT TestBilgi VALUES(‘İÇÖĞÜŞ’,’İÇÖĞÜŞ’)
      komuutile db ye düzgün kayıt edildiğini görüyorum. php ile odbc üzerinden db’ bağlandıgımda verileri select ile çetkiğimde; İ ler I , Ş ler S Ğ’ler G olarak geliyor. Php ile insert yaptıgımda ise; verilerim;
      Ad Soyad
      ÝÞÐÜ ÞÐÜð gbi karekter degişerek db ye kaydoluyor. bu sorunu nasıl çözebilirim acaba. bildigim bütün yolları denedim çözülmedi sorun. aynı db ye kendi localimden php çalıştırdıgımda düzgün oluyor. severin php.ini’ ayarlarında birşeymi yapılması gerek acaba. ordada utf8 idi diye biliyorum..

      Cevapla
    107. Aytaç ARSLAN

      Üstad selamlar netsiste database imiz türkçe olmadığından büyük i leri aratırken sorun oluyor ve sıralamalar yanlış oluyor. Yeniden windows kuruldu ve sql kurarken türkçe kursam ve database i mount ettiğimde sorun yaşarmıyım? yoksa eski database için dil farklı olduğundan sorun olur mu? teşekkür ederim.

      Cevapla
    108. Halil Oymacı

      Çok teşekkürler. Icerik isminde tablo oluşturmuştum. Turkish_CI_AS ayarında tabloya ICERIK ile erişemedim. Bunun sebebi anlamış oldum. Tekrar teşekkürler açıklayıcı olmuş.

      Cevapla
    109. Abdullah

      Bu ve diğer sitelerden öğrendiğim – anladığım bilgiler ışığında Türkçe karakterleri Latin1 formatına çevirebilmek için bir fonksiyona ihtiyac var, bu fonksiyonumuz Latin1_Gonder.
      Yine ayrıca Latin1 karakterleri de tekraradan Türkçeye çevrili olarak alabilmek için ayrı bir fonksiyon ihtiyacımız var, bu fonksiyonumuz Turkce_Getir.

      Latin1_Gonder fonksiyonu hakkında dikkat edilmesi gereken bir kaç husus vardır ilki şu, fonksiyon çalıştırılırken fonksiyona parametre olarak geçilen karakterlerin başına tırnaktan önce N karakteri konmalıdır ki veri unicode olarak ele alınabilsin bilindiği üzere Türkçe bazı karakterlerin Ascii karşılığı yoktur.
      ikinci ise fonksiyonun tanımı sırasında fonksiyona gönderilen değerin fonksiyon içinde BÜYÜK KÜÇÜK harf duyarlı olarak unicode şeklinde ele alınmasıdır, eğer büyük küçük duyarlığı dikkate alınmazsa sonuçta karakterler birbirine karışabilmektedir.

      Latin1_Gonder fonksiyonunun tanımlandığı ortam bilgileri şöyledir; DBCC USEROPTIONS komutu ile baktığım oturum dili us_english tablo collation ayarı ‘SQL_Latin1_General_CP1_CI_AS’.
      Latin1_Gonder fonksiyonu şu şekilde çalıştırılmalıdır N harfine dikkat : select dbo.LATIN1_GONDER(N’ıIiİşŞğĞçÇöÖüÜ’) [Latin1] ,dbo.Turkce_Getir(dbo.LATIN1_GONDER(N’ıIiİşŞğĞçÇöÖüÜ’)) [Türkçe]

      Ayrıca Turkce_Getir fonksiyonun tanımı da aşağıdaki gibidir.

      Create FUNCTION [dbo].[LATIN1_GONDER](@METIN NVARCHAR(4000))
      RETURNS NVARCHAR(4000)
      AS
      BEGIN
      DECLARE @GELEN_DEGER NVARCHAR(4000)

      SET @GELEN_DEGER = REPLACE(@METIN Collate Turkish_CS_AS, NCHAR(246), N’ö’) — kucuk o ordek
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(231), N’ç’) — kucuk c cekic

      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(214), N’Ö’) — BUYUK O ORDEK
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(199), N’Ç’) — BUYUK C CEKIC

      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(305), N’ý’) — kucuk I Isparta
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(304), N’Ý’) — BUYUK I iZMIR
      — SET @GELEN_DEGER = REPLACE(@GELEN_DEGER , NCHAR(73), N’I’) — buyuk I ISPARTA

      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(286), N’Ð’) — BUYUK YUMSAK G
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(287), N’ð’)– kucuk yumsak g

      — SET @GELEN_DEGER = REPLACE(@GELEN_DEGER , NCHAR(105), N’i’) — kucuk i izmir
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE Turkish_CS_AS, NCHAR(252), N’ü’) — kucuk u urgup
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE Turkish_CS_AS, NCHAR(220), N’Ü’ ) — BUYUK U URGUP

      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(351), N’þ’) — kucuk s sanli
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER Collate Turkish_CS_AS, NCHAR(350), N’Þ’) — BUYUK S SANLI

      RETURN @GELEN_DEGER Collate Turkish_CS_AS
      — RETURN @GELEN_DEGER Collate SQL_Latin1_General_CP1254_CS_AS

      END

      CREATE FUNCTION [dbo].[Turkce_Getir](@METIN NVARCHAR(4000))
      RETURNS NVARCHAR(4000)
      AS
      BEGIN
      DECLARE @GELEN_DEGER NVARCHAR(4000)
      SET @GELEN_DEGER = REPLACE(@METIN COLLATE LATIN1_GENERAL_BIN, NCHAR(208), N’G’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(220), N’Ü’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(222), N’S’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(253), N’i’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(221), N’I’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(214), N’Ö’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(199), N’Ç’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(73), N’I’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(240), N’g’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(252), N’ü’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(254), N’s’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(105), N’i’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(246), N’ö’)
      SET @GELEN_DEGER = REPLACE(@GELEN_DEGER COLLATE LATIN1_GENERAL_BIN, NCHAR(231), N’ç’)

      RETURN @GELEN_DEGER COLLATE Turkish_CI_AS
      END

      Cevapla
    110. Serkan

      Hocam Merhaba,
      Facebook ürün yüklemek için ASP ile dinamik XML oluşturuyorum.
      Database Collation Turkish_CI_AI seçili. Tablolarda Türkçe karakteri sorunu yok.
      Xml coding utf-8 yapıyorum. Codepage 65001 seçili. Response.Charset utf-8.
      Bu şekilde ayarladığımda sayfada türkçe karakter sorunu çıkıyor.

      Xml coding windows-1254 yapıyorum. Codepage 1254 seçili. Response.Charset windows-1254.
      Bu şekilde ayarladığımda sayfa sorunsuz gözüküyor.
      Fakat bu seferde facebooka gönderdiğimde sıkıntı çıkartıyor.

      Hocam bu sorunu nasıl çözeceğimi bilemedim. Database de Collationları değiştirdim. Her türlü kombinasyonla denedim bir türlü olmadı. Yardımınıza ihtiyacım var.

      Cevapla
    111. muhammed

      Merhabalar,
      SQL_Latin1_General_CP1254_CI_AS tipinde olan bir db den Turkish_CI_AI tipinde olan bir db ye trigger veya procedüre aracılığıyla veri aktarmak istiyorum. Turkish_CI_AI tipinde olan DB CRM sistemine bağlı. bu nedenle sistem patlar düşüncesiyle collation değiştiremiyorum.
      İki collationdan da veri alıp gönderebilecek bir collation tipi var mıdır. Köprü vazifesi görebilecek bir DB oluşturabilir miyim?

      Saygılar sunuyorum.

      Cevapla

    Bir yanıt yazın

    E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir