1. Anasayfa
  2. Blog
  3. Hatalar ve Sorun Giderme

Mysql Türkçe Karakter Sorunu Çözümü

Mysql Türkçe Karakter Sorunu Çözümü

MySQL Türkçe karakter sorunu, genellikle karakter kodlaması (charset) ve karşılaştırma kuralları (collation) uyumsuzluğundan kaynaklanır. Örneğin “ş” karakterinin “?” veya garip semboller olarak görünmesi gibi. Türkçe karakterler UTF-8 karakter setinde tanımlanmıştır ve MySQL’in varsayılan Latin1 (latin1_swedish_ci) karakter seti bu karakterleri desteklemez. Bu nedenle, veritabanınızı oluştururken veya mevcut veritabanınızı yapılandırırken doğru karakter setini seçmeniz gerekir.

Türkçe Karakter Sorununun Temel Nedenleri

  • Yanlış Karakter Seti– MySQL’in varsayılan latin1_swedish_ci karakter seti Türkçe karakterleri desteklemez. UTF-8 kullanılmalıdır.
  • Bağlantı Kodlaması– Uygulama ile veritabanı arasındaki bağlantıda karakter seti belirtilmemesi sorun yaratır.
  • HTML Meta Etiketleri– Web sayfasında UTF-8 charset belirtilmemesi tarayıcıda yanlış gösterime neden olur.
  • MySQL Yapılandırması– my.cnf veya my.ini dosyasında varsayılan karakter setinin yanlış yapılandırılması sistematik sorunlara yol açar.
BeklenenGörünen
ÇalışmaÇalışma
ŞifreÅžifre
ÖğrenciÖğrenci
Bu durum genellikle karakter seti (charset) ve kolasyon (collation) uyumsuzluğundan kaynaklanır.

Bu sorunların her biri ayrı ayrı veya birlikte ortaya çıkabilir. Örneğin, veritabanınızı UTF-8 olarak oluştursanız bile, PHP bağlantı kodunuzda karakter setini belirtmezseniz Türkçe karakterler yine bozuk görünecektir. Bu nedenle, sorunun çözümü için tüm katmanları kontrol etmek ve doğru yapılandırmak gerekir. Özellikle dikkat edilmesi gereken bir nokta, veri aktarımı sırasında karakter dönüşümlerinin gerçekleşmesidir. Veri Latin1’den UTF-8’e veya tersi yönde dönüştürüldüğünde, Türkçe karakterler kalıcı olarak bozulabilir. Bu nedenle, proje başlangıcında doğru karakter setini seçmek ve tüm sistem boyunca tutarlı bir şekilde kullanılmalıdır.

Veritabanı Oluştururken Doğru Yapılandırma

Yeni bir MySQL veritabanı oluştururken en iyi uygulama, baştan UTF-8 karakter setini kullanmaktır. Bu, ileride karşılaşabileceğiniz karakter sorunlarını önlemenizi sağlar. MySQL’de UTF-8 için iki temel seçenek bulunur: utf8mb4 ve utf8. Günümüzde utf8mb4 kullanılması önerilir çünkü tüm Unicode karakterlerini destekler ve emoji gibi 4 byte’lık karakterleri de saklar.

  • Aşağıdaki komut, veritabanınızı Türkçe karakter sıralaması (collation) ile oluşturur. utf8mb4_turkish_ci kolasyonu, Türkçe karakterlerin doğru sıralanmasını sağlar. Örneğin, “ç” harfi “c” ile “d” arasına değil, “c”den hemen sonra gelir. “ci” son eki “case insensitive” anlamına gelir; yani büyük-küçük harf duyarlılığı yoktur.
CREATE DATABASE veritabani_adi 
CHARACTER SET utf8mb4
COLLATE utf8mb4_turkish_ci;
  • Veritabanı Oluştur– CREATE DATABASE komutuyla utf8mb4 ve turkish_ci belirt.
  • Tabloları Oluştur– Her tablo için de aynı karakter setini ve kolasyonu kullan.
  • Bağlantıyı Yapılandır– Uygulama kodunda SET NAMES utf8mb4 komutunu çalıştır.
  • Test Et– Türkçe karakter içeren veri ekleyerek doğru çalıştığını kontrol et.

Tablo oluştururken de aynı karakter setini kullanmayı unutmayın:

CREATE TABLE urunler (
id INT AUTO_INCREMENT PRIMARY KEY,
urun_adi VARCHAR(255),
aciklama TEXT
) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci;

Bu yaklaşım, veritabanınızın her seviyesinde tutarlı bir karakter kodlaması sağlar ve gelecekteki sorunları önler. Özellikle büyük projelerde, baştan doğru yapılandırma yapmak sonradan yapılacak düzeltmelerden çok daha kolay ve güvenlidir.

Mevcut Veritabanında MySQL Türkçe Karakter Sorunu Düzeltme

Eğer mevcut bir veritabanınız varsa ve latin1 gibi eski charset’ler kullanıyorsa, panik yok! Adım adım dönüştürebilirsiniz. Uyarı: Bu işlem veri kaybına yol açabilir, mutlaka yedek alın!

  • Mevcut veritabanınızın karakter setini kontrol etmek için şu komutu kullanabilirsiniz:
SHOW CREATE DATABASE veritabani_adi;
  • Eğer sonuçta latin1 veya utf8 (utf8mb4 değil) görüyorsanız, değişiklik yapmanız gerekir. Veritabanının karakter setini değiştirmek için:
ALTER DATABASE veritabani_adi
CHARACTER SET utf8mb4
COLLATE utf8mb4_turkish_ci;
  • Ancak bu komut yalnızca veritabanının varsayılan karakter setini değiştirir. Mevcut tablolar ve sütunlar etkilenmez. Her tabloyu da ayrı ayrı değiştirmeniz gerekir:
ALTER TABLE tablo_adi 
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_turkish_ci;
  • Tüm tabloları tek tek değiştirmek yerine, aşağıdaki sorgu ile veritabanındaki tüm tabloları listeleyip otomatik komutlar oluşturabilirsiniz:
SELECT CONCAT('ALTER TABLE ', table_name, 
' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci;')
FROM information_schema.tables
WHERE table_schema = 'veritabani_adi';
  • Bu sorgu size çalıştırmanız gereken ALTER TABLE komutlarını verecektir. Dikkat edin, büyük tablolarda bu işlem uzun sürebilir ve veritabanı kilitlenebilir. Bu nedenle, düşük trafikli saatlerde veya bakım penceresinde yapılması önerilir.

⚠️ Eğer veritabanınızda Türkçe karakterler zaten bozuk şekilde saklanmışsa (örneğin “ş” yerine “þ” gibi), CONVERT TO komutu sorunu çözmeyecektir. Bu durumda verileri düzeltmek için özel scriptler yazmanız veya yedekten geri yükleme yapmanız gerekir.

PHP ve MySQL Bağlantısında Karakter Seti Ayarları

MySQL’de karakter setini doğru yapılandırdıktan sonra, PHP uygulamanızın da bu karakter setini kullanması için bağlantı ayarlarını yapmanız gerekir. Çoğu Türkçe karakter sorunu, veritabanı doğru yapılandırılmış olsa bile, bağlantı katmanında karakter setinin belirtilmemesinden kaynaklanır.

  • MySQLi ile Bağlantı: MySQLi kullanıyorsanız, bağlantı kurduktan hemen sonra karakter setini ayarlamalısınız:
$mysqli = new mysqli("localhost", "kullanici", "sifre", "veritabani");

// Karakter setini ayarla
$mysqli->set_charset("utf8mb4");

// Veya query ile
$mysqli->query("SET NAMES 'utf8mb4'");
$mysqli->query("SET CHARACTER SET utf8mb4");

// Veri ekleme örneği
$stmt = $baglanti->prepare("INSERT INTO urunler (isim, aciklama) VALUES (?, ?)");
$stmt->bind_param("ss", "Şahmerdan Çiçeği", "Bu güzel çiçek İstanbul bahçelerinde yetişir.");
$stmt->execute();
?>

set_charset() metodunu kullanmak, SET NAMES komutundan daha güvenlidir çünkü hem istemci hem de sunucu tarafında karakter setini doğru şekilde ayarlar ve SQL injection saldırılarına karşı daha güvenlidir.

  • PDO ile Bağlantı: PDO (PHP Data Objects) kullanıyorsanız, bağlantı dizesinde (DSN) karakter setini belirtebilirsiniz:
$pdo = new PDO(
"mysql:host=localhost;dbname=veritabani;charset=utf8mb4",
"kullanici",
"sifre",
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

// Veri okuma
$stmt = $baglanti->query("SELECT * FROM urunler");
while ($row = $stmt->fetch()) {
echo $row['isim'] . ": " . $row['aciklama'] . "<br>"; // Türkçe doğru görünecek!
}
?>
  • mysqli_* Fonksiyonları (Eski Yöntem)– Eski prosedürel mysqli fonksiyonları kullanıyorsanız:
$baglanti = mysqli_connect(
"localhost",
"kullanici",
"sifre",
"veritabani"
);
mysqli_set_charset($baglanti, "utf8mb4");
  • HTML Sayfasında da UTF-8 Belirtin– PHP kodunun yanı sıra, HTML sayfalarınızın head bölümünde de karakter setini belirtmeyi unutmayın: <meta charset="UTF-8">
  • Ayrıca PHP dosyasının başına header ekleyebilirsiniz:
<?php
header('Content-Type: text/html; charset=utf-8');
?>

Tüm bu ayarları yapmak, verinin veritabanından PHP’ye ve oradan da tarayıcıya kadar tüm yolculuğunda UTF-8 kodlamasını korumasını sağlar. Bu katmanlı yaklaşım, Türkçe karakterlerin her aşamada doğru görünmesini garanti eder.

HTML ve Web Sayfalarında Türkçe Karakter Desteği

Veritabanı doğru olsa bile, web sayfası UTF-8 değilse sorun devam eder. Her PHP dosyanızın başına ekleyin:

<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ürünler – Türkçe Destekli Site</title>
</head>
<body>
<!-- İçerik buraya -->
</body>
</html>
  • Formlar için: <form method="post" accept-charset="UTF-8">

MySQL Yapılandırma Dosyasında Varsayılan Ayarlar

MySQL sunucusunun varsayılan karakter setini sistem genelinde değiştirmek için yapılandırma dosyasını düzenlemeniz gerekir. Bu, tüm yeni veritabanları ve tablolar için otomatik olarak UTF-8 karakter setinin kullanılmasını sağlar ve gelecekte oluşabilecek sorunları önler.

  • MySQL yapılandırma dosyası işletim sistemine göre farklı konumlarda bulunur:
    • Linux: /etc/mysql/my.cnf veya /etc/my.cnf
    • Windows: C:\ProgramData\MySQL\MySQL Server X.X\my.ini
    • XAMPP: C:\xampp\mysql\bin\my.ini
    • WAMP: C:\wamp\bin\mysql\mysqlX.X.XX\my.ini
    • MAMP (macOS): /Applications/MAMP/conf/my.cnf
  • Yapılandırma dosyasını bir metin editörü ile açın ve aşağıdaki satırları ilgili bölümlere ekleyin veya mevcut satırları güncelleyin:
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_turkish_ci
init_connect='SET NAMES utf8mb4'
  • Değişiklikleri yapmadan önce MySQL servisini durdurun: Windows’ta services.msc, Linux’ta sudo service mysql stop
  • my.cnf veya my.ini dosyasını yönetici yetkisiyle açın ve yukarıdaki ayarları ekleyin.
  • Dosyayı kaydedin ve MySQL servisini yeniden başlatın: sudo service mysql start.
  • SHOW VARIABLES LIKE 'char%'; komutuyla ayarların doğru uygulandığını kontrol edin.
  • Değişikliklerin etkili olması için MySQL sunucusunu yeniden başlatmanız gerekir. Linux’ta:
sudo service mysql restart
# veya
sudo systemctl restart mysql
  • Windows’ta, Hizmetler (Services) panelinden MySQL servisini bulup sağ tıklayarak “Yeniden Başlat” seçeneğini kullanabilirsiniz. Yapılandırmanın başarılı olup olmadığını kontrol etmek için MySQL’e bağlanıp şu komutu çalıştırın:
SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'collation%';
  • Sonuçlarda utf8mb4 ve utf8mb4_turkish_ci değerlerini görmelisiniz. Eğer hala eski değerleri görüyorsanız, yapılandırma dosyasını doğru konumda düzenlememiş olabilirsiniz veya MySQL birden fazla yapılandırma dosyası kullanıyor olabilir.

Veri Aktarımı ve Yedeklemede Dikkat Edilmesi Gerekenler

MySQL veritabanınızı yedeklerken veya başka bir sunucuya taşırken Türkçe karakterlerin korunması için özel dikkat göstermeniz gerekir. Yanlış yapılandırılmış bir yedekleme veya geri yükleme işlemi, tüm Türkçe karakterlerin kalıcı olarak bozulmasına neden olabilir.

  • mysqldump kullanarak yedek alırken karakter setini belirtmek oldukça önemlidir:
mysqldump -u kullanici -p --default-character-set=utf8mb4 \
  --result-file=yedek.sql veritabani_adi
  • –default-character-set=utf8mb4 parametresi, dump dosyasının UTF-8 formatında oluşturulmasını sağlar. Bu parametre olmadan, mysqldump latin1 kullanabilir ve Türkçe karakterler bozulur. Ayrıca –result-file parametresi kullanmak, çıktının doğrudan dosyaya yazılmasını sağlar ve komut satırı kodlama sorunlarını önler.
Yedek AlırkenGeri Yüklerken
mysqldump -u root -p \
--default-character-set=utf8mb4 \
--single-transaction \
--routines \
--triggers \
--result-file=yedek_$(date +%Y%m%d).sql \ veritabani_adi
mysql -u root -p \
--default-character-set=utf8mb4 \ veritabani_adi < yedek.sql
  • phpMyAdmin ile Export/Import: phpMyAdmin kullanıyorsanız, export işlemi sırasında “Format-specific options” bölümünde “Character set of the file” seçeneğini utf-8 olarak ayarlayın. Import işleminde de aynı şekilde “Character set of the file” seçeneğini utf-8 yapın.

CSV dosyalarıyla veri aktarımı yapıyorsanız, dosyanın UTF-8 kodlamasında kaydedildiğinden emin olun. Excel, varsayılan olarak CSV dosyalarını Windows-1254 (Türkçe) kodlamasında kaydeder ve bu MySQL’de sorun yaratır. Bunun yerine, Notepad++ veya VS Code gibi editörlerle dosyayı UTF-8 olarak kaydedin veya Excel’de “CSV UTF-8” formatını kullanın.

  • LOAD DATA INFILE komutuyla veri yüklerken de karakter setini belirtin:
LOAD DATA INFILE '/path/to/data.csv'
INTO TABLE tablo_adi
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

Test Etme ve Sorun Giderme

Tüm yapılandırmaları yaptıktan sonra, sistemin doğru çalıştığını test etmek çok önemlidir. Aşağıdaki adımları takip ederek Türkçe karakter desteğinizin eksiksiz olduğundan emin olabilirsiniz.

  • Veritabanı ve Tablo Karakter Setlerini Kontrol Edin:
-- Tüm veritabanlarını listele
SHOW DATABASES;

-- Belirli bir veritabanının karakter setini göster
SHOW CREATE DATABASE veritabani_adi;

-- Tüm tabloları ve karakter setlerini listele
SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'veritabani_adi';

-- Belirli bir tablonun yapısını göster
SHOW CREATE TABLE tablo_adi;
  • Sistem Değişkenlerini Kontrol Edin:
SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'collation%';
  • Bu sorgunun sonucunda şu değişkenlerin tümünün utf8mb4 değerine sahip olması gerekir:
    • character_set_client
    • character_set_connection
    • character_set_database
    • character_set_results
    • character_set_server
    • character_set_system
  • Test Verisi Ekleyin ve Sorgulayın– Gerçek kullanım senaryosunu simüle etmek için test verisi ekleyin:
-- Test tablosu oluştur
CREATE TABLE karakter_testi (
id INT AUTO_INCREMENT PRIMARY KEY,
metin VARCHAR(255)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci;

-- Test verisi ekle
INSERT INTO karakter_testi (metin)
VALUES ('şöğüıçŞÖĞÜİÇ Türkçe karakterler');

-- Veriyi kontrol et
SELECT * FROM karakter_testi;

Eğer sorgulama sonucunda Türkçe karakterler doğru görünüyorsa, veritabanı tarafı düzgün çalışıyor demektir.

  • PHP uygulamanızla test yapın:
<?php
header('Content-Type: text/html; charset=utf-8');

$mysqli = new mysqli("localhost", "kullanici", "sifre", "veritabani");
$mysqli->set_charset("utf8mb4");

// Veri ekle
$metin = "Türkçe karakterler: şğıüöçŞĞİÜÖÇ";
$stmt = $mysqli->prepare("INSERT INTO karakter_testi (metin) VALUES (?)");
$stmt->bind_param("s", $metin);
$stmt->execute();

// Veriyi oku
$result = $mysqli->query("SELECT * FROM karakter_testi ORDER BY id DESC LIMIT 1");
$row = $result->fetch_assoc();

echo "Eklenen: " . $metin . "<br>";
echo "Okunan: " . $row['metin'];
?>

Sorun devam ediyorsa, MySQL hata loglarını kontrol edin. Linux’ta genellikle /var/log/mysql/error.log dosyasında bulunur. Hata mesajları sorunun kaynağı hakkında ipuçları verebilir. Ayrıca, MySQL'in SHOW WARNINGS komutunu kullanarak son işlemle ilgili uyarıları görebilirsiniz.

Burada sadece teorik bilgiler değil, gerçek deneyimlere dayanan pratik çözümler var. Burada yol arkadaşı olacağız. Karmaşık konuları birlikte çözecek, teknik detayları birlikte aşacağız...

Yazarın Profili

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