← Kursa Dön
📄 Text · 35 min

String Fonksiyonları: CONCAT, SUBSTRING, UPPER, LOWER

Giriş — Metin Verisiyle Çalışmak

Veritabanındaki metinler her zaman istediğin formatta olmaz. Müşteri adı küçük harfle kaydedilmiş, e-postanın başında boşluk var, ürün adından bir kelimeyi çıkarman gerekiyor... İşte string fonksiyonları bu tür metin işlemlerini veritabanı seviyesinde yapmana olanak tanır.

🎯 Analoji: String fonksiyonlarını bir metin atölyesi gibi düşün. Elindeki metni kesebilir, birleştirebilir, büyütebilir, küçültebilir, kenarlarını düzeltebilir, parçalarını değiştirebilirsin — orijinal veriyi bozmadan.


CONCAT ve CONCAT_WS — Metin Birleştirme

CONCAT — Basit Birleştirme

-- Ad ve soyadı birleştir
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM customers;
-- "Ahmet Yılmaz", "Zeynep Kaya", ...

-- Fiyat formatlama
SELECT CONCAT('₺', price) AS formatted_price FROM products;
-- "₺54999.99", "₺64999.99", ...

-- Birden fazla parçayı birleştir
SELECT CONCAT(first_name, ' ', last_name, ' (', city, ')') AS customer_info
FROM customers;
-- "Ahmet Yılmaz (İstanbul)"

⚠️ Dikkat: MySQL'de CONCAT parametrelerinden biri bile NULL ise sonuç NULL olur! ``sql SELECT CONCAT('Ahmet', NULL, 'Yılmaz'); -- NULL! -- Çözüm: COALESCE kullan SELECT CONCAT(first_name, ' ', COALESCE(last_name, '')); ``

CONCAT_WS — Ayırıcı ile Birleştirme

CONCAT_WS (With Separator) ilk parametre ayırıcı, sonrakiler birleştirilecek değerler. NULL değerleri otomatik atlar.

-- Virgülle ayır
SELECT CONCAT_WS(', ', city, phone, email) AS contact_info FROM customers;
-- "İstanbul, 05551001001, ahmet@email.com"
-- phone NULL ise: "İstanbul, ahmet@email.com" (NULL atlanır!)

-- Adres oluştur
SELECT CONCAT_WS(' - ', city, 'Türkiye') AS address FROM customers;

💡 İpucu: NULL olabilecek sütunları birleştirirken CONCAT_WS kullan, CONCAT değil. CONCAT_WS NULL'ları otomatik atlar ve ayırıcıyı tekrar etmez.


UPPER ve LOWER — Büyük/Küçük Harf Dönüşümü

-- Tümü büyük harf
SELECT UPPER(first_name) AS upper_name FROM customers;
-- "AHMET", "ZEYNEP", "MEHMET"

-- Tümü küçük harf
SELECT LOWER(email) AS lower_email FROM customers;
-- Zaten küçük olsa bile garanti etmek için

-- E-posta normalleştirme
SELECT * FROM customers WHERE LOWER(email) = LOWER('AHMET@EMAIL.COM');

-- Ürün adı büyük harfle göster
SELECT UPPER(product_name) AS product, price FROM products;

⚠️ Dikkat: Türkçe I/İ dönüşümü sorunlu olabilir: - UPPER('istanbul') → collation'a bağlı olarak 'ISTANBUL' veya 'İSTANBUL' - utf8mb4_turkish_ci collation'da doğru çalışır - utf8mb4_unicode_ci'da 'i' → 'I' olur ('İ' değil)


LENGTH, CHAR_LENGTH — Uzunluk Ölçme

-- CHAR_LENGTH: Karakter sayısı (önerilen)
SELECT product_name, CHAR_LENGTH(product_name) AS char_count FROM products;
-- "MacBook Pro 14"" → 15

-- LENGTH: Byte sayısı (dikkat!)
SELECT product_name, LENGTH(product_name) AS byte_count FROM products;
-- Türkçe karakterler (ş, ç, ğ) UTF-8'de 2 byte kaplar

-- Fark:
SELECT LENGTH('Türkçe'), CHAR_LENGTH('Türkçe');
-- LENGTH: 8 (T=1, ü=2, r=1, k=1, ç=2, e=1)
-- CHAR_LENGTH: 6 (6 karakter)

💡 İpucu: Karakter sayısını ölçmek istiyorsan her zaman CHAR_LENGTH kullan. LENGTH byte sayısı verir ve UTF-8 multibyte karakterlerde yanıltıcı olur.

-- 50 karakterden uzun ürün adları
SELECT product_name FROM products WHERE CHAR_LENGTH(product_name) > 50;

-- Kısa e-posta adresleri (şüpheli olabilir)
SELECT email FROM customers WHERE CHAR_LENGTH(email) < 10;

SUBSTRING (SUBSTR) — Metin Kesme

-- Belirli pozisyondan başlayarak kes
SUBSTRING(metin, başlangıç_pozisyonu, uzunluk)

-- İlk 3 karakter
SELECT SUBSTRING('Merhaba Dünya', 1, 3);  -- "Mer"

-- 5. karakterden itibaren
SELECT SUBSTRING('Merhaba Dünya', 5);  -- "aba Dünya"

-- E-posta domain'ini çıkar
SELECT email, 
       SUBSTRING(email, LOCATE('@', email) + 1) AS domain
FROM customers;
-- "email.com", "email.com", ...

-- Ürün kodunun ilk 3 harfi
SELECT product_name, SUBSTRING(product_name, 1, 3) AS code FROM products;

LEFT ve RIGHT — Baştan/Sondan Kes

-- İlk 5 karakter
SELECT LEFT(product_name, 5) FROM products;
-- "MacBo", "iPhon", "Samsu"

-- Son 5 karakter
SELECT RIGHT(email, 5) FROM customers;
-- "l.com", "l.com"

-- Maskeleme (gizlilik)
SELECT CONCAT(LEFT(email, 3), '***@***', RIGHT(email, 4)) AS masked_email
FROM customers;
-- "ahm***@***.com"

-- Telefon numarası maskeleme
SELECT CONCAT('****', RIGHT(phone, 4)) AS masked_phone
FROM customers WHERE phone IS NOT NULL;
-- "****1001"

TRIM, LTRIM, RTRIM — Boşluk Temizleme

-- Baş ve sondaki boşlukları temizle
SELECT TRIM('   Merhaba   ');      -- "Merhaba"
SELECT LTRIM('   Merhaba   ');     -- "Merhaba   " (sadece sol)
SELECT RTRIM('   Merhaba   ');     -- "   Merhaba" (sadece sağ)

-- Belirli karakteri temizle
SELECT TRIM(BOTH '-' FROM '---Merhaba---');    -- "Merhaba"
SELECT TRIM(LEADING '0' FROM '000123');         -- "123"
SELECT TRIM(TRAILING '.' FROM 'test...');       -- "test"

-- Veri temizleme
UPDATE customers SET first_name = TRIM(first_name);
UPDATE customers SET email = LOWER(TRIM(email));

💡 İpucu: Kullanıcı girişlerinde boşluk sorunu çok yaygındır. Veri eklerken TRIM uygulamak iyi pratiktir: INSERT INTO customers (email) VALUES (TRIM(LOWER(' User@Email.COM '))).


REPLACE — Metin Değiştirme

-- Belirli bir metni başka metinle değiştir
SELECT REPLACE('Merhaba Dünya', 'Dünya', 'SQL');  -- "Merhaba SQL"

-- Ürün adındaki tırnak işaretini temizle
SELECT REPLACE(product_name, '"', '') AS clean_name FROM products;

-- Telefon numarasını formatla
SELECT REPLACE(REPLACE(phone, ' ', ''), '-', '') AS clean_phone
FROM customers;

-- Toplu veri düzeltme
UPDATE products 
SET product_name = REPLACE(product_name, '  ', ' ')  -- Çift boşluğu tek boşluk yap
WHERE product_name LIKE '%  %';

Diğer Kullanışlı String Fonksiyonları

LOCATE / INSTR — Pozisyon Bulma

-- '@' karakterinin pozisyonu
SELECT email, LOCATE('@', email) AS at_position FROM customers;
-- ahmet@email.com → 6

-- Ürün adında "Pro" nerede?
SELECT product_name, LOCATE('Pro', product_name) AS pro_pos
FROM products WHERE product_name LIKE '%Pro%';

REVERSE — Ters Çevirme

SELECT REVERSE('Merhaba');  -- "abaherM"

REPEAT — Tekrarlama

SELECT REPEAT('*', 5);  -- "*****"

-- Yıldızlı rating gösterimi
SELECT product_name, REPEAT('★', ROUND(rating)) AS stars FROM products;

LPAD, RPAD — Doldurma

-- Soldan sıfır doldurma (sipariş numarası formatı)
SELECT LPAD(order_id, 8, '0') AS order_number FROM orders;
-- "00000001", "00000002", ...

-- Sağdan boşluk doldurma
SELECT RPAD(product_name, 30, '.') AS formatted FROM products;
-- "MacBook Pro 14"............."

Gerçek Dünya Örneği — Veri Temizleme ve Formatlama

-- Müşteri verisi temizleme ve formatlama raporu
SELECT 
    customer_id,
    -- Ad-soyad düzgün format: ilk harf büyük, geri kalanı küçük
    CONCAT(
        UPPER(LEFT(TRIM(first_name), 1)), 
        LOWER(SUBSTRING(TRIM(first_name), 2))
    ) AS formatted_first_name,
    -- E-posta normalleştirme
    LOWER(TRIM(email)) AS clean_email,
    -- Telefon maskeleme
    CASE 
        WHEN phone IS NOT NULL 
        THEN CONCAT(LEFT(phone, 4), '***', RIGHT(phone, 2))
        ELSE 'Yok'
    END AS masked_phone,
    -- Şehir bilgisi
    COALESCE(UPPER(city), 'BELİRTİLMEMİŞ') AS city
FROM customers;

Sıkça Yapılan Hatalar

  1. CONCAT'te NULL tuzağı: CONCAT('a', NULL) = NULL. CONCAT_WS veya COALESCE kullan.

  2. LENGTH vs CHAR_LENGTH karışıklığı: UTF-8'de Türkçe karakterler 2 byte. Karakter sayısı için CHAR_LENGTH kullan.

  3. UPPER/LOWER Türkçe sorunu: Collation'a bağlı. utf8mb4_turkish_ci Türkçe I/İ dönüşümünü doğru yapar.

  4. SUBSTRING pozisyonu 1'den başlar: SQL'de string pozisyonu 1'den başlar, 0'dan değil (çoğu programlama dilinden farklı).

  5. LIKE yerine string fonksiyonu kullanmak: WHERE SUBSTRING(name, 1, 3) = 'Mac' yavaştır (index kullanamaz). WHERE name LIKE 'Mac%' çok daha hızlıdır.


Özet

  • CONCAT / CONCAT_WS — metin birleştirme (WS versiyonu NULL-safe)

  • UPPER / LOWER — büyük/küçük harf dönüşümü

  • CHAR_LENGTH — karakter sayısı (UTF-8 için doğru), LENGTH — byte sayısı

  • SUBSTRING / LEFT / RIGHT — metin kesme

  • TRIM / LTRIM / RTRIM — boşluk temizleme

  • REPLACE — metin değiştirme

  • LOCATE — metin içinde pozisyon bulma

  • LPAD / RPAD — doldurma (sıfır ekleme, formatlama)

  • String fonksiyonlarını WHERE'de kullanmak index'i devre dışı bırakır — dikkatli kullan