Karakter Verileriyle Çalışmak – Bölüm 20

T-SQL sorgularınızda çalışacağınız verilerin karakter verisi içermesi muhtemeldir. Karakter verileri sadece kapasite ve depolama seçeneklerini değil aynı zamanda dil, sıralama düzeni ve collation (harmanlama) gibi metne özgü konuları da içermektedir. Bu bölümde, SQL Server karakter tabanlı veri tiplerini, karakter karşılaştırmalarının nasıl çalıştığını ve sorgularda kullanırken yararlı olabilecek birkaç fonksiyondan bahsedeceğiz.

Karakter Veri Tipleri

SQL Server birçok sayısal veri türüne sahiptir. Sayısal verilerle çalışmak nispeten kolaydır çünkü sayısal veriler bir takım düzgünce tanımlanmış matematiksel kurallara dayalıdır.

Karşılaştırma yapmak gerekirse, daha az sayıda karakter veri türü olmasına rağmen bu veri türleriyle çalışmak daha karmaşık olabilmektedir. Bunun nedeni, birden fazla dili, karakter kümelerini, aksan karakterleri, sıralama kurallarını, büyük/küçük harf duyarlılığını, kapasite ve depolamayı göz önünde bulundurmak gerektiğidir. Bu faktörlerin her birinin sorgu yazarken karşılaşılan karakter veri türlerinin her birinin üzerinde bir etkisi olabilir.

SQL Server’daki karakter veri türleri iki özelliğe göre sınıflandırılır:

  • Sabit(fixed) veya değişken(variable) genişlikteki veriler için karakter türleri:
    • Sabit uzunluktaki veriler, karakter verisindeki karakter sayısına bakılmaksızın her zaman tutarlı bir boyutta saklanır. Kullanılmayan yerler padding yöntemiyle (boşluk ile) doldurulur.
    • Değişken uzunluktaki veriler, karakter verisiyle aynı boyutta ve fazladan küçük bir ek birim kullanarak saklanır.
  • Single-byte (tek baytlık) veya multi-byte (çok baytlı) karakter kümesi için karakter türleri:
    • Single-byte karakter kümesi, karakter başına bir bayt şeklinde depolanan 256 farklı karakteri destekler. Varsayılan olarak, SQL Server bu verileri yorumlamak için ASCII karakter kümesini kullanmaktadır.
    • Multi-byte karakter kümesi, her karakteri birden çok bayt olarak depolayarak 65.000’den fazla farklı karakteri destekler. Karakter başına iki bayt hatta bazen daha fazla yer kullanılabilir. SQL Server, bu verileri yorumlamak için UNICODE UCS-2 karakter kümesini kullanmaktadır.

Kullanılabilir dört karakter veri türü, bu özelliklerin tüm olası kombinasyonları desteklenmektedir:

Veri tipiSabit uzunlukDeğişken uzunlukSingle-byte KarakterlerMulti-Byte Karakterler
char Evet Evet
nchar Evet Evet
varchar Evet Evet
nvarchar Evet Evet

Sütun veya değişken tanımlarken, opsiyonel olarak depolanabilecek maksimum karakter verisi uzunluğunu verilir. String uzunluğu için genelde bir değer belirtmek gereklidir. Maksimum uzunluk değeri verilmezse, varsayılan değer bir karakter uzunluğunda olur.

Varchar ve nvarchar veri tiplerinde max ifadesi kullanarak çok uzun string’lerin depolanabilmesi sağlanır. Varchar(max) ve nvarchar(max) tanımlamaları, kullanımdan kaldırılan text ve ntext türlerinin yerini alır.

Veri tipi Aralık Depolama
char(n)
nchar(n)
1-8000 karakter
1-4000 karakter
n bayt,
padded 2*n bayt,
padded
varchar(n)
nvarchar(n)
1-8000 karakter
1-4000 karakter
Gerçek uzunluk + 2 bayt
varchar(max)
nvarchar(max)
2 GB’a kadar Gerçek uzunluk + 2 bayt

Not: Tüm karakter verileri tek tırnak işareti ile sınırlandırılır.

  • Single-byte karakter verileri tek başına tek tırnak işareti ile gösterilir. Örneğin ‘SQL Server’.
  • Multi-byte karakter verileri, başına N (National) getirilerek (örneğin, N‘SQL Sunucusu’) ön ekli şekilde tek tırnak işareti ile gösterilir. Verileri bir multi-byte bir sütuna veya değişkene eklerken bile N öneki kullanmak her zaman gereklidir.
Collation

SQL Server üzerinde karakter bayt sayısı ve uzunluğuna ek olarak karakter veri türlerine collation da atanmaktadır.

Collation, karakter verilerinin, aşağıdakiler dahil olmak üzere birkaç yönünü belirleyen özellik koleksiyonudur:

  • Şunlardan türetilen dil veya yerel ifadeler:
    • Character set
    • Sort order
  • Case sensitivity
  • Accent sensitivity

Not: Collation yapılandırılması SQL Server kurulumu sırasında yapılmaktadır ancak veri tabanı veya sütunun collation’ı sonradan değiştirilebilmektedir. Sorguda farklı bir collation ayarı yaparak bazı karakter verileri için geçerli olan collation geçersiz kılınabilir.

Sorgulama yaparken, karakter verileriniz için collation ayarlarının farkında olmanız önemlidir.

Aşağıdaki sorguda WHERE ifadesiyle sütun değerlerinin büyük/küçük harfe duyarlı olup olmadığı test edilerek sonuçlar döndürür. Burada sütun değerleri büyük/küçük harfe duyarlıysa sonuç döner:

SELECT empid, lastname
FROM HR.employees
WHERE lastname = N’Funk’;

Veritabanında depolanan verilerle eşleşemeyecek şekilde arama terimini değiştirirsek herhangi bir satır döndürülmez:

SELECT empid, lastname
FROM HR.employees
WHERE lastname = N’funk’;

COLLATE ifadesi, bir sütunun collation’ını geçersiz kılmak ve sorgu çalıştırıldığında farklı bir collation uygulanmasını sağlamak için kullanılmaktadır.

Bu örnekte, WHERE ifadesinde COLLATE ifadesi kullanılarak Latin1_General collation’ı ve karakter tablosunu kullanarak büyük/küçük harfe duyarlı bir karşılaştırma işlemi yapılmaktadır:

SELECT empid, lastname
FROM HR.employees
WHERE lastname COLLATE Latin1_General_CS_AS = N’Funk’;

Not: Veritabanı düzeyindeki collation ayarları, veritabanı objelerine (tablolar ve view’lar gibi) ve karakter verilerine uygulanır.

Örneğin, büyük/küçük harfe duyarlı bir varsayılan collation’a sahip bir veritabanında, “HR.Employees” ve “HR.employees” isimli tabloları iki farklı nesneye atıfta bulunacaktır.

Büyük/küçük harfe duyarlı olmayan bir collation’a sahip bir veritabanında, “HR.Employees” ve “HR.employess” isimleri aynı nesneye işaret eder..

String’leri Birleştirme

SQL Server’da birden çok karakter verilerine uygulanan string birleştirme işlemi için değişik yöntemler bulunmaktadır.

CONCAT fonksiyonunu, en az iki veya daha fazla veri değerini alır ve birleştirerek bir string değeri döndürür.

Input verilerinden herhangi biri karakter veri türünde değilse, implicit olarak bir karakter veri türüne dönüştürülür.

NULL değerler empty string’e dönüştürülür.

CONCAT fonksiyonunun syntax’ı aşağıdaki gibidir:

CONCAT (string_value1, string_value2 [,string_valueN])

CONCAT fonksiyonuna bir örnek:

SELECT custid, city, region, country,
CONCAT(city, ', ' + region, ', ' + country) AS location
FROM Sales.Customers;

Döndürülen sonucun bir kısmı aşağıda gösterilmiştir:

custid city region country location
------ ----------- ------ -------- -------------------
1 Berlin NULL Germany Berlin, Germany
2 México D.F. NULL Mexico México D.F., Mexico
3 México D.F. NULL Mexico México D.F., Mexico
4 London NULL UK London, UK
5 Luleå NULL Sweden Luleå, Sweden

CONCAT fonksiyonu SQL Server 2012 ile birlikte gelmiştir. SQL Server’ın 2012’den önceki sürümlerinde CONCAT fonksiyonu olmadığı için String birleştirme işlemi + (plus) operatörü kullanılarak gerçekleştirilir. Bu operatörle birleştirilen string değerlerinden biri NULL ise, output değeri de NULL olacaktır. Ayrıca veri türü dönüşümü de gerçekleştirilmez.

Aşağıdaki örnek, + operatörünün bir isim ve soyismi arasına boşluk koyarak tek bir string’te birleştirmektedir:

SELECT
empid, lastname, firstname, firstname + N' ' + lastname AS fullname
FROM HR.Employees;

Not: Artı işareti aynı zamanda aritmetik ekleme için kullanıldığından, birleştirirken verilerinizden birinin sayısal veri türünde olup olmadığına göz atın. Karakter veri türleri, sayısal veri türünden daha düşük önceliğe sahiptir. SQL Server bunları birleştirmek yerine veri türlerini dönüştürüp öyle eklemeye çalışacaktır.

Character String Fonksiyonları

SQL Server’da karakter verilerini olduğu gibi almak, string’deki belirlenen bölümleri çıkarmak veya daha fazla uzunlukta bir string içindeki karakterlerin konumunu belirlemeniz gerekebilir. SQL Server’da bu işlemleri gerçekleştirmek için bir takım yerleşik fonksiyonlar bulunmaktadır. Bu fonksiyonlardan bazıları şunlardır:

  • FORMAT: Bir input değerini, isteğe bağlı olarak .NET biçimindeki bir string verisine dayalı karakter dizisi şeklinde biçimlendirmenize olanak tanır.

Bu sorguda, FORMAT fonksiyonu input olarak bir para değeri alır ve belirtilen diğer ülkelerin para birimlerine çevirir:

DECLARE @m money = 120.595
SELECT @m AS unformatted_value,
FORMAT(@m,'C','zh-cn') AS zh_cn_currency,
FORMAT(@m,'C','en-us') AS en_us_currency,
FORMAT(@m,'C','de-de') AS de_de_currency;

Dönen sonuç:

unformatted_value zh_cn_currency en_us_currency de_de_currency
----------------- -------------- -------------- --------------
120.595 ¥120.60 $120.60 120,60 €
  • SUBSTRING : Başlangıç noktası verilerek bir string değerinin bir kısmını alır ve string olarak geri döndürür.

Bu örnekte SUBSTRING kullanımı gösterilmiştir:

SELECT SUBSTRING('Microsoft SQL Server ',11,3) AS Result;

Dönen sonuç:

Result
-------
SQL
  • LEFT ve RIGHT : String’in solundan veya sağından birkaç karakter döndürüleceğini belirler.

Bu sorguda LEFT ve RIGHT kullanımı gösterilmiştir:

SELECT LEFT('Microsoft SQL Server',9) AS left_example,
RIGHT('Microsoft SQL Server',6) AS right_example;

Dönen sonuç:

left_example right_example
------------ -------------
Microsoft Server
  • LEN ve DATALENGTH : Karakter sayısı veya bir string’te saklanan bayt sayısı gibi meta verileri sorgulamanızı sağlar.

Bu örnekte bir string kullanarak LEN ve DATALENGTH ifadelerinden döndürülen sonuç gösterilmektedir:

SELECT LEN('Microsoft SQL Server ') AS [LEN];
SELECT DATALENGTH('Microsoft SQL Server ') AS [DATALENGTH];

Dönen sonuç:

LEN
-----------
20
DATALEN
-----------
25
  • CHARINDEX : Bir string içerisinde başka bir string aranır ve bulunursa başlangıç konumu dönmesi sağlanır. Hedef bulunamazsa 0 değeri döner.

Bu örnekte CHARINDEX kullanımı ve çıktısı gösterilmektedir:

SELECT CHARINDEX('SQL','Microsoft SQL Server') AS Result;

Dönen sonuç:

Result
-----------
11
  • REPLACE : Bir string içerisindeki belirlenen değerleri, başka bir string değeri ile değiştirmenizi sağlar.

Bu örnekte REPLACE fonksiyonuyla string değeri bulunduğunda aşağıdaki çıktı gösterilmektedir:

SELECT REPLACE('Learning about T-SQL string functions','T-SQL','Transact-SQL') AS Result

Dönen sonuç:

Result
--------------------------------------
Learning about Transact-SQL string functions
  • UPPER ve LOWER : Karakter durumu dönüşümleri yapmak için kullanılır.

Bu örnekte string değeri durumunu değiştirmek için UPPER ve LOWER kullanımı gösterilmektedir:

SELECT UPPER('Microsoft SQL Server') AS [UP],LOWER('Microsoft SQL Server') AS [LOW];

Dönen sonuç:

UP         LOW
-------------------- --------------------
MICROSOFT SQL SERVER microsoft sql server
LIKE Predicate

SQL Server’da sorgularda karakter verileri kullanarak eşleştirme işlemlerinden daha fazlasını yapabiliriz. LIKE predicate’ini WHERE ifadesiyle kullanarak patern bulma işlemi gerçekleştirebiliriz.

Paternler, tek başına veya bir string içerisinde arama yapmak için bir kısmı aşağıda listelenen, bir arada kullanılabilen sembollerle ifade edilir:

  • % (Yüzde), herhangi bir uzunlukta bir string değeri temsil eder. Örneğin, LIKE ‘Sand%’, ‘Sand ‘, ’Sandwich ‘, ‘Sandwiches‘ gibi string değeriyle eşleşir.
  • _ (Alt çizgi) tek bir karakteri temsil eder. Örneğin, LIKE N’_a%‘, ikinci karakteri ‘a’ harfi olan herhangi bir string değeriyle eşleşir.
  • [] ile verilen listedeki tek bir karakteri temsil eder. Örneğin, LIKE N'[DEF]%’ paterniyle ‘D’, ‘E’ veya ‘F’ ile başlayan herhangi bir string değeriyle eşleşir.
  • [ – ], belirtilen aralıktaki tek bir karakteri temsil eder. Örneğin, LIKE N ‘[N-Z]%’ paterniyle N ve Z arasında bulunan (N ve Z dahil) alfabe harfleriyle başlayan herhangi bir string değeriyle eşleşme sağlanır.
  • [^ ], belirtilen listede veya aralıkta olmayan tek bir karakteri temsil eder. Örnek, LIKE N’^[A]%’ paterniyle ‘A’ dışında bir karakterle başlayan her string değeriyle eşleşme sağlanır.
  • ESCAPE, bir escape karakteri belirlemek için kullanılır, yani bir joker karakteri arayabilir, fakat bunu bir joker karakter yerine literal olarak da ele alabilirsiniz. Hazır bilgi olarak ele alınacak özel karakterin her bir örneği, belirtilen escape karakterinden önce gelmelidir. Örneğin, LIKE N’10!% indirim%’ ESCAPE ‘!’ paterni ‘% 10 indirim’ ile eşleşecek ancak ‘100 özel teklif’ ile eşleşmeyecektir (ESCAPE ifadesi kullanılmazsa eşleşebilir).

Kaynak:
COLLATE (Transact-SQL)
Collation and Unicode Support
CONCAT (Transact-SQL)
String Functions (Transact-SQL)

Leave a Reply

Your email address will not be published. Required fields are marked *