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
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'
Microsoft, SQL Server’in 2005’ten sonraki versiyonlarında bu özelliği kaldıracağını söylemektedir.
[ , [ @language= ] 'language' ]
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;
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;
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.
SELECT * FROM fn_helpcollations()
SQL Server’da collation ayarları,
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
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
Açıklayıcı bilgileriniz için teşekkürler.yoldas.cu.edu.tr
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.
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
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.ALTER DATABASE benimDatabase COLLATE TURKISH_CI_AS
ALTER DATABASE benimDatabase SET MULTI_USER
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
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 +
Bu “ALTER TABLE . . .” ifadeleri single modda çalıştırıldığı zaman ilgili kolonların collation değeri “TURKISH_CI_AS” olarak set edilmiş olur.' 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'
Teşekkürler.
Verdiğiniz bilgiler çok faydalı.
Teşekkürler.
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.
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..
Ü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
Ayrıca “SQL_Latin1_General_CI_AS” ismiyle “SQL_Latin1_General_CP1_CI_AS” serisini kasdediyorsunuz sanırım.ALTER DATABASE airties COLLATE SQL_Latin1_General_CP1_CI_AS
ALTER DATABASE airties SET MULTI_USER
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
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.
Teşekkür Ederim.
Sayğılar
gercekten çok güzel bir döküman ellerinize sağlık
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)
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;
Eğer bu kod başarılı olmazsa SQL Collation türünü deneyebilirsiniz. Hem böylece Code Page de değiştirilmiş olur.update PARAMETER set PARAMETERVALUE = N'ç;ı;ğ;ö;ş;ü' where PARAMETERNAME = 'specialtoken'
select PARAMETERVALUE from PARAMETER where PARAMETERNAME = 'specialtoken'
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;alter table PARAMETER alter column PARAMETERVALUE nvarchar(1500) COLLATE SQL_Latin1_General_CP1254_CI_AS;
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
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.As
SELECT
AdSoyad, Unvan FROM DBO.MUSTERI
İ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ü?
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
İ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
Aynı şekilde eski kayıtlara uygun da arama yapılabilir.WHERE C1 collate French_CI_AI='Türkçe'
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.
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
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.
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 ?
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('İÇÖĞÜŞ','İÇÖĞÜŞ')
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
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.
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…
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.
Ahmet bey,pratikde Turkish_CI_AS ile Turkish_CI_AI arasında fark gördünüzmü ?
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)
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.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.'
Yardım ve önerileriniz için teşekkür ederim.İyi çalışmalar.
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.
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.
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?
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.
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.
indexlerin kaldırılması nedemektir, nasıl yapılır? collation dan sonra bu table ların indexi nasıl oluşturulur?
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.
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..
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ı.
Verdiğiniz değerli bilgileri için çok teşekkür ederim
Serverdaki dil problemine bir çözüm getirdim
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.
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.
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
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.
Gerçekten oldukça yararlı bir çalışma. Teşekkürler.
Eline koluna sağlık gerçekten çok açık ve anlaşılır bir döküman olmuş. Teşekkür ederim.
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.
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.
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
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",
... )
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
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.z
INSERT tablo (sutun) VALUES (N'Türkçe Veri')
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
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..
ö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
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
Ö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
ö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
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.
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.
teşekkür ederim
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.
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
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.
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..
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.
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
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,
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..
parametre olarak N koymak hayat kurtardı sağolasın kral
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?
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.
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
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.
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.
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
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
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.
COLLATE bundan daha kısa ve anlaşılır anlatılamz her halde.. teşekkürler
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
Ö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 ?
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 ?
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.
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.
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.
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.
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.
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.
Çok güzel bir yazı olmuş. Ne kadar teşekkür etsem azdır.
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.
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.
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..
Verileri unicode olarak girmeniz yani değerin başına N eklemeniz gerekmektedir. N’????’ gibi.
Paylaşımınız için çok teşekkürler, çok faydalı bir makale.
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?
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.
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.
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
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.
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
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.
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
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.
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.
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
Tufan,SQL Server’in gelen verinin unicode olduğunu anlaması için başına “N” eklemek zorundasın.
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.
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?
Leo,17.mesajda detayını anlattığım gibi değerlerin başına “N” harfini eklemek sorunu çözecektir.
değerlerin başına “N” harfini eklemek sorunu çözmedi bir qeder etrafli aciq bir cavab yazsaydiz cox sad olardim
Emeğinize sağlık. Çok güzel bir makale.
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.
Merhaba, Yukarıda kaçırdığım bir nokta olmuş değerlerin başına N ekleyince sorunum düzeldi. Teşekkürler.
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.
teşekkürler. N’ çok işime yaradı.
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
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.
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?
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.
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.
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.
Ç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
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
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..
Ü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.
Ç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ş.
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
Abdullah selam,
çok faydalı bir dönüşüm fonksiyonu olmuş. Eline sağlık 🙂
Hocam çok faydalı bir yazı olmuş çok teşekkür ederim
Her seferinde okuduğum kodu ezberleyemeyip, tekrar tekrar giriyorum buraya 🙂
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.
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.