PHP ve MSSQL Bağlantısı Türkçe Karakter Problemleri

Eğer bir database tanımlaması (collation) düzgün yapılandırılmadıysa taşıdığınız ya da yeni oluşturduğunuz veritabanındaki (database) içeriklerde bulunan türkçe karakterler bozulabilir. Bunun nedeni veritabanını (database) oluştururken seçmemiş olduğunuz ve muhtemelen default kalan "collation" ayarıdır. Eğer default (kendiliğinden) değeriniz türkçe değilse tnaımlama bozuk olacaktır.

PHP ve MSSQL Bağlantısı Türkçe Karakter Problemleri

Yeni bir veritabanı oluştururken ya da veritabanı (database) taşırken yeni ekranında sol tarafta bulunan "Options" sekmesinde açılan "Collation" öğesini "TURKISH_CI_AS" olarak seçmelisiniz

PHP ve MSSQL Bağlantısı Türkçe Karakter Problemleri

Burada sağda üst kısımda görüldüğü üzere "Collation" <server default> olarak ayarlanmış. Bunu "TURKISH_CI_AS" olarak değiştirirseniz tanımlama anlamında herhangi bir karakter sorunu yaşamazsınız. 

PHP ve MSSQL Bağlantısı Türkçe Karakter Problemleri

Bir veritabanının (database) tanımlama dilini kontrol etmek isterseniz. Sql Server Management Tools a bağlandığınızda sol taraftaki veritabanı (database) listesinden istediğiniz database e sağ tıklayın. "Properties" i seçin. Burada açılan "General" sekmesinde görüldüğü üzere sağ tarafta altta Maintenance başlığında "Collation" kısmı bulunmaktadır. 

PHP ve MSSQL Bağlantısı Türkçe Karakter Problemleri

Türkçe karakterleri latin karakterlere çevirerek yazıyorsa, Veritabanından new query diyerek aşağıdaki komutları çalıştırmak yeterli olacaktır.

USE master;
GO
ALTER DATABASE TestDb
COLLATE Turkish_CI_AS ;
GO

 
Collation ayarlarını kontrol etmek için

SELECT name, collation_name
FROM sys.DATABASES
WHERE name = N'TestDb';
GO
 
 
 

MSSQL’de eğer databasimizin collation’u Turkish_CI_AS seçilmemişse insert yaparken türkçe karakter problemi yaşamamız mümkün. Eğer veritabanınız GoDaddy gibi yurtdışında bulunan bir hosting firmasında bulunuyorsa collation default olarak Latin1 seçilmiş olabiliyor. Bunu değiştirme yetkiniz yoksa, insert ve update yaparken stringlerimizi unicode olarak göndermemiz gerekli.

Stringleri unicode olarak göndermek için başına büyük N harfi koymamız gerekli.  Bu şekilde gönderilen tüm karakter setleri unicode olarak kaydedilecektir. Bu sayede türkçe karakterlerimiz korunmuş olacaktır.

INSERT INTO dbo.Kitaplar (yazar) VALUES(N’DEITEL’);

 

Unicode verilerin gönderilmesinde sıkıntı yaşanıyor. Arıca PHP sunucusundan MSSQL sql sunucusuna yapılan bağlantılardaki türkçe karakter sorunun çözümüde aşağıdaki gibidir.

Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY000]: General error: 4004 General SQL Server error: Check messages from the SQL Server [4004] (severity 16) [(null)]in

  Linux terminale :

sudo nano /etc/freetds/freetds.conf

  Bu dosyada şu satırı bulup

[global]
        # TDS protocol version
;       tds version = 4.2
 
 
hemen altına şu satırları ekliyoruz…
 


 
tds version = 8.0
client charset = UTF-8

  kaydedip Linux sistemi yeniden başlatıyoruz.

 
 
 

Kaynaklar

Yorumunuzu Ekleyin

$_ENV
Yükleniyor...