<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQL Server ASP.NET C# Kitabı &#187; Sql Server Türkçe karakter</title>
	<atom:link href="http://www.ahmetkaymaz.com/wp-seo-link-holder_akaymaz.php/tag/sql-server-turkce-karakter/feed/?404;http://www.ahmetkaymaz.com:80/tag/sql-server-turkce-karakter/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ahmetkaymaz.com</link>
	<description>SQL Server, C#, VB.NET, ASP.NET, AJAX ile ilgili örnek kitap ve ipuçları</description>
	<lastBuildDate>Tue, 20 Dec 2011 09:25:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL Server&#8217;de Language ve Collation kavramı</title>
		<link>http://www.ahmetkaymaz.com/2006/12/29/sql-serverde-language-ve-collation-kavrami/</link>
		<comments>http://www.ahmetkaymaz.com/2006/12/29/sql-serverde-language-ve-collation-kavrami/#comments</comments>
		<pubDate>Fri, 29 Dec 2006 17:30:00 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
				<category><![CDATA[C#, VB.NET, ASP.NET]]></category>
		<category><![CDATA[Collation]]></category>
		<category><![CDATA[Sql Server Türkçe karakter]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/sql-serverde-language-ve-collation-kavrami/2006/12/30/</guid>
		<description><![CDATA[Bu makalede SQL Server&#8217;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&#8217;in desteklediği dil veya diller hakkında ayrıntılı bilgi [...]]]></description>
			<content:encoded><![CDATA[<div class="google_plus_one"><g:plusone size="standard" count="true" url="http://www.ahmetkaymaz.com/2006/12/29/sql-serverde-language-ve-collation-kavrami/"></g:plusone></div><p>Bu makalede SQL Server&#8217;da <strong>language</strong> ve <strong>collation</strong> 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.</p>
<p>SQL Server&#8217;in desteklediği dil veya diller hakkında ayrıntılı bilgi almak için <strong>sp_helplanguage</strong> procedure kullanılabilir. Bu procedure, <em>@language</em> parametresi girilmezse tüm dillerin ayrıntısı listelenir. Language tanımlamaları, sys şemasına bağlı <strong>syslanguages</strong> tablosunda saklıdır.</p>
<pre name="code" class="sql">--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'</pre>
<p>SQL Server&#8217;da dil ayarı sunucu ve kullanıcı(oturum) bazında etkili olur. SQL Server&#8217;in instanceni kurarken language değerini de set edebiliriz. Sunucunun default dil değerini <strong>Sever Properties</strong> penceresindeki <strong>Advanced</strong> sekmesindeki <stong></stong>Default Language bölümünden görebilir ve değiştirebiliriz. Programatik olarak T-SQL ile değiştirmek için <strong>sp_configure</strong> yordamı kullanılır. <span id="more-27"></span>Bilindiği gibi sunucuyla ilgili yapılandırma bilgileri <strong>master</strong> veritabanı altındaki <strong>sys.sysconfigures</strong> tablosunda tutulmaktadır. Bu tablodaki <strong>default language</strong> değerini okuyarak sunucunun aktif language bilgisine ulaşabiliriz. Bu tabloyu doğrudan update etmek yerine <strong>sp_configure</strong> yordamını kullanarak sunucunun dilini değiştirebiliriz. Bu yordamı çalıştırdıktan sonra sunucuyu yeniden yapılandırmak için <strong>RECONFIGURE</strong> ifadesini kullanmalıyız. Bu ifade, stop-restart gerektirmeyen değişiklikleri o anda aktifleştirir.</p>
<pre name="code" class="sql">sp_configure 'default language', 22--turkish yani
reconfigure with override--Aksi durumda SQL restart olduktan sonra aktifleşir</pre>
<p>Bağlı olduğumuz kullanıcının, oturumun dilini öğrenmek için <strong>@@LANGUAGE</strong> isimli global değişkeni kullanılır. Kullanıcının o anki oturumunda geçici olarak dili değiştirmek için <strong>SET LANGUAGE</strong> kullanılır. <code>SET LANGUAGE { [ N ] 'language' | @language_var } </code>Bunu genellikle o anda tarih veya para birimini düzenlemek için kullanırız.</p>
<pre name="code" class="sql">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ü</pre>
<p>Yeri gelmişken söyleyelim oturumumuzda tarih formatını değiştirmek için <strong>SET DATEFORMAT</strong> deyimi de kullanılabilir.<code>SET DATEFORMAT { format | @format_var }</code> Böylece kalıcı değil sadece o oturumda tarih formatını değiştirmiş oluruz.</p>
<pre name="code" class="sql">--Tarih formatını day, month, year olarak düzenleyelim.
SET DATEFORMAT dmy
DECLARE @Tarih DATETIME
SET @Tarih = '31/12/2006'
SELECT @Tarih AS Tarih</pre>
<p>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&#8217;in klasik hatası <font color="#ff0000">The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.</font> mesajıyla karşılaşırdık.</p>
<p>Bir kullanıcının kalıcı olarak dil ayarını değiştirmek için <strong>sp_defaultlanguage</strong> procedure kullanılır.<code>sp_defaultlanguage [ @loginame= ] 'login'<br />
[ , [ @language= ] 'language' ] </code>Microsoft, SQL Server&#8217;in 2005&#8242;ten sonraki versiyonlarında bu özelliği kaldıracağını söylemektedir.</p>
<pre name="code" class="sql">EXEC sp_defaultlanguage 'Ayse', 'Turkish'</pre>
<p>Buna alternatif olarak <strong>ALTER LOGIN</strong> ifadesiyle güncellemenin yapılması tavsiye edilir. Nitekim, <strong>sp_defaultlanguage</strong> yordamı da <strong>ALTER LOGIN . . .</strong> komut yapısını çalıştırmaktadır.</p>
<pre name="code" class="sql">ALTER LOGIN Ayse WITH DEFAULT_LANGUAGE = Turkish</pre>
<p>Bu ifade, Ayse isimli login için default language değerini Türkçe olarak set eder.</p>
<p><strong>Collation</strong>, işletim sisteminden bağımsız olup bir dil veya alfabenin karakter kurallarını tanımlar. Örneğin Türkçe dilinde küçük &#8220;i&#8221; ile büyük &#8220;İ&#8221;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 <strong>Language ID Reference Number(LCID)</strong> koduyla saklar. Bu numaralandırma aynı dilleri veya alfabeleri aynı çatıda toplamak için kullanılan bir yöntemdir.<br />
Collationlar, karakterlerin doğru yazılıp okunması ve karşılaştırılmasından sorumludur.<br />
SQL Server, iki tür collation yapısı sunar;<lu></lu></p>
<li>Windows collations</li>
<li>SQL collations<br />
SQL Server collation, Unicode (<strong>nchar</strong>,<strong>nvarchar</strong> ve <strong>ntext</strong>) ve non-Unicode(<strong>char</strong>,<strong>varchar</strong> ve <strong>text</strong>) veri türlerinin sıralaması ve karşılaştırılmasında önemli rol oynar. SQL server&#8217;da collation tanımları 4 bölümden oluşur;<lu></lu></li>
<li>Sıralama Kuralları – Dil veya alfabe adı.</li>
<li>Üstünlük &#8211; Büyük küçük karakter önceliği(seçimli)</li>
<li>CodePage &#8211; ASCII code page(seçimli)</li>
<li>CaseSensitivity + AccentSensitivity veya BIN &#8211; Aksan veya binary kodCaseSensitivity CI (case insensitive) veya CS (case sensitive) değerlerini alabilir
<p>AccentSensitivity AI (accent insensitive) veya AS (accent sensitive) olabilir.</p>
<p>BIN ifadesi, text sıralama yerine binary sort algoritmasına göre sıralamanın yapılacağını bildirir.</p>
<p>Örneğin <em>SQL_Latin1_General_Pref_CP437_CI_AS</em> 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 <em>SQL_Latin1_General_CP1254_CI_AS</em> ifadesi de Latin alfabesinde 1254 Page Code&#8217;un(256 karakter ki Türkçe bu aileye dahildir) Case Insensitive ve Accent Sensitive özellikleriyle kullanılacağı anlamına gelmektedir.<br />
Buşekilde SQL Server collationlar aşağıdaki suffixlerle tanımlanmıştır. <lu></lu></li>
<li>_BIN (Binary)</li>
<li>_CI/_CS (Case Sensitivity)</li>
<li>_AI/_AS(Accent Sensitivity)</li>
<li>_KS(Kana character Sensitivity, Japonca kana karakter seti) (hiragana/katakana)</li>
<li>_WS(Width Sensitivity)(full[double-byte character]/half width[single-byte character]) SQL Server&#8217;da iki kaydın sıralama veya karşılaştırılmasında 5 ihtimal vardır.<lu></lu></li>
<li>Ascending or descending? (is ‘a’&gt;‘b’?)</li>
<li>Case-sensitive? (is ‘a’&gt;‘A’?)</li>
<li>Accent-sensitive? (is ‘a’=‘á’?)</li>
<li>Character width? (is ‘a’&gt;‘aa’?)</li>
<li>Kana character types? (is ‘?’=‘?’?)SQL Server&#8217;daki collation ad ve açıklamalarına erişmek için <strong>fn_helpcollations</strong> fonksiyonu kullanılabilir.
<pre name="code" class="sql">SELECT * FROM fn_helpcollations()</pre>
<p>SQL Server&#8217;da collation ayarları, <lu></lu></li>
<li>Server</li>
<li>Database</li>
<li>Column</li>
<li>Expression bazında gerçekleştirilebilir.<br />
Server bazında collation ayarlaması, oluşturulacak databaseleri etkiler ve onların default collation değeri olmuş olur. SQL Server, ilk kurulduğunda Windows&#8217;un yerel ayarlarına(Regional and Language Options) uygun collation değerini set eder. Serverin collation bilgisi, Management Studio&#8217;da Object Explorer penceresinde ilgili serverin Database Engine&#8217;nine sağ tıklayıp properties bölümünden General sekmesindeki Server Collation bölümünden görülebilir. Ayrıca <strong>SERVERPROPERTY</strong> fonksiyonuna <em>collation</em> parametresi gönderilerek te öğrenilebilir.</p>
<pre name="code" class="sql">SELECT SERVERPROPERTY('collation')</pre>
<p>Bu query, benim makinemde <em>Turkish_CI_AS</em> değerini döndürdü. Makinemizdeki SQL Server instance&#8217;in hangi karakter sıralaması(sort order) ve karakter seti(character set) kullandığını öğrenmenin daha açık yolu <strong>sp_helpsort</strong> procedureni kullanmaktır. Bu procedure, benim makinem için <em>Turkish, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive</em> değerini döndürdü.Server&#8217;in collation bilgisi, ../Tools/BINN klasörü altındaki <strong>RebuildM.exe</strong> aracıyla değiştirilebilir.</p>
<p>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 <server></server>olarak bırakılabilir. Veya T-SQL yardımıyla database oluşturulurken <strong>COLLATE</strong> sözcüğüyle collation değeri girilebilir.</p>
<pre name="code" class="sql">CREATE DATABASE FrDatabase COLLATE French_CI_AI</pre>
<p>Sunucu üzerindeki databaselerin collation değerlerini görmek için <strong>sys.databases</strong> tablosu sorgulanabilir veya</p>
<pre name="code" class="sql">--Sistemdeki databaselerin collation bilgilerini listeyelim
SELECT name, collation_name FROM sys.databases</pre>
<p>Veritabanındaki nesne sorgulamalarında collation değeri rol oynadığı için <em>Turkish_CI_AS</em> değerine sahip bir databasede <strong>Musteri</strong> isimli bir tablomuz olsun. Bunu hem <em>Musteri</em> hem de <em>Musterİ</em> olarak çağırabiliriz. Çünkü bu collation, Türkçe dilinin büyük-küçük karektere duyarlı olmayan şeklini temsil etmektedir, Türkçe&#8217;de küçük &#8220;i&#8221; ile büyük &#8220;İ&#8221; birbirine eşit olduğu için tablo ismi sorun çıkarmamaktadır. Bu tabloyu MusterI diye büyük &#8220;ı&#8221; ile çağıramayız bu şekilde çağırmak için collation tipinin İngilizce(<em>SQL_Latin1_General_CP1_CI_AS</em>) olması gerekmektedir. SQL Server&#8217;da bir database&#8217;in Collation değerlerini değiştirmek için o database&#8217;i single user moda getirip <em>ALTER DATABASE . . .</em> ifadesi kullanılır.</p>
<p>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&#8217;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.</p>
<pre name="code" class="sql">CREATE TABLE [dbo].[OGRENCI](
	[AdSoyad] [char](10) COLLATE Turkish_CI_AS NULL
) ON [PRIMARY]</pre>
<p>Sanırım en ilginç yanı SQL Server&#8217;da özellikle koşul ve sıralama esnasında deyimler seviyesinde de collation değeri girebiliyor olmamızdır. Bunu sorgulamalarda yine aynı şekilde <strong>COLLATE</strong> ifadesiyle sağlıyoruz. <code>COLLATE [Windows_Collation_name|SQL_Collation_Name]</code> 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 <em>ACicekci</em> şeklinde bir kayıt için sorgulamalarda hem <em>ACicekci</em> hem de <em>ACICEKCI</em> durumunda gelinmesi isteniyorsa aşağıdaki gibi bir sorgulama yapmamız gerekir. <em>UYE</em> isimli tablonun <em>UserNameEng</em> ve <em>UserNameTr</em> isimli kolonları bulunsun. <em>UserNameEng</em> kolonunun collation değeri <em>SQL_Latin1_General_CP1_CI_AS</em> <em>UserNameTr</em> kolonunun collation değeri de <em>Turkish_CI_AS</em> olsun. Her ikisini de char(10) olarak set edip her iki kolona da <em>ACicekci</em> bilgisini girelim.</p>
<pre name="code" class="sql">--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</pre>
<p>Tablodaki kolonun collation değerini değiştirmek için <em>ALTER TABLE . . .</em> ifadeesi kullanılır.</p>
<pre name="code" class="sql">ALTER TABLE <TabloAdı> ALTER COLUMN <KolonAdı> COLLATE <CollationAdı></pre>
<p>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 &#8220;SQL_Latin1_General_CP1_CI_AS&#8221; and &#8220;Turkish_CI_AS&#8221; in the equal to operation.</font> hatası oluşur.</p>
<pre name="code" class="sql">SELECT * FROM UYE
WHERE UserNameTr=UserNameEng</pre>
</li>
 
<span class = "" style = "height: 25px;  float: left; "><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.ahmetkaymaz.com/2006/12/29/sql-serverde-language-ve-collation-kavrami/&layout=standard&send=false&show_faces=false&width=&action=like&colorscheme=light&font=" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:25px"></iframe></span>]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2006/12/29/sql-serverde-language-ve-collation-kavrami/feed/</wfw:commentRss>
		<slash:comments>112</slash:comments>
		</item>
	</channel>
</rss>

