PHP, SQL Server karakter tutarsızlıklar

3 Cevap php

Ben PHP kullanarak Latin olmayan karakterler (örneğin, İbranice, eklemek için N'string kullanarak Arapça vb ') eklemeye çalıştığınızda çok garip bir şey bana oldu. Mssql, odbc ve yerli sürücüsü: Bu şey, ben denedim tüm uzantıları ile olur.

PHP kodu ile takarken PHP ile seçerken sadece, iyi çalışıyor ve ben ekledikten okuyabilirsiniz. Sorgu analizörü dizelerinde anlamsız görünüyor ve C + + kodu da anlamsız alır.

Query Analyzer ile takarken analizörü ve C + + kod iyi görünüyor ama PHP kullanarak seçerken ben soru işaretleri yerine dizeleri olsun.

3 Cevap

Eğer düzgün bir bağlantı harmanlama kontrol edilmez. Eğer verileri ele başlamadan önce, ya da (ben kullandığınız harmanlama UTF şeklidir varsayalım) yapılandırma dosyasında değiştirerek uygun sorguları göndererek ayarlayın.

Ben MsSQL için aynı çevirir emin değilim, ama MySQL sorgular şunlardır:

SET NAMES 'utf8';
SET CHARACTER SET 'utf8';

Ve kalıcı olarak ayarlayın eşleşen yapılandırma nitelikler vardır.

Bu iki sorunlarından biri nedeniyle olabilir: veritabanı / tablo / sütun eklemek için çalışıyoruz karakterleri bilinmeyen olduğu belirlenen bir karakter kullanıyor. Senin durumunda, UTF-8 kullanmanızı tavsiye ediyorum (çoğunlukla Latin olmayan karakterler kullanarak sürece, o UTF-16 tercih olacaktır). Eğer veritabanı bu karakterleri depolama kapasitesine sahip olduğundan kesinlikle emin değilseniz, o da (bir veritabanı bağlantısı veritabanı tarafından kullanılmakta olandan farklı bir karakter kümesi kullanmak için ayarlanabilir) yanlış bağlantı ayarları olabilir.

Başka bir sorun PHP Unicode desteği olmasıdır. Eğer PHP kaynak dosyasına gömülür eklemek için çalışıyoruz, ya da bunu çalıştırmadan önce sorguda dize işlevlerini uyguluyorsanız karakterler, şans eğer Yani PHP zaten özgün dize karıştırılmış gelmiştir. Neyse ki, PHP Unicode karakter desteği yok, çeşitli fonksiyonlara sahip, bu yüzden bu kullanmak mümkün olabilir. Bunlardan bazılarını burada bulabilirsiniz:

http://php.net/manual/en/refs.international.php

Biz de tüm yöntemleri denedim ve DEPARTMENTNAME alanlarında unicode veri işleme iki iş çözümleri bulundu. Ne yazık ki, SQL Server Driver for PHP hala bazı hatalar var ve UTF-16LE elle DEPARTMENTNAME gibi alanlarını dönüştürmek zorunda olarak kullanmak gerçekten zor. Orada Zend Framework 1.9.0 destek olduğunu, ancak ben henüz bakmadım.

Şu anda, PHP SQL Server erişmek için en iyi yolu, COM ve OLEDB kullanarak gibi görünüyor:

$conn = new COM('ADODB.Connection', null, 65001);
$conn->Open('Provider=SQLNCLI;Server=SERVER;Database=DB;Uid=USER;Pwd=PASS');
$rs = $conn->Execute('SELECT nvarcharfield FROM sometable');
while (!$rs->EOF) { 
    echo $rs->Fields('nvarcharfield')->value, "\n";
    $rs->MoveNext();
} 
$rs->Close();

"65001" Bu bileşen ne istediğiniz muhtemelen UTF-8 modunda çalışması gerektiğini gösterir. Yani içinde ve dışında tüm veriler UTF-8 kodlama olacaktır.

Hazırlanan sorgular COM kullanarak programlamak kadar karmaşık olmasa bu harika olurdu, böylece PHP için ADOdb bakmak isteyebilirsiniz. Daha sonra kod sadece biraz farklı olur:

$conn = NewADOConnection('ado_mssql');
$conn->charPage = 65001;
$conn->Connect('Provider=SQLNCLI;Server=SERVER;Database=DB;Uid=USER;Pwd=PASS');
$conn->SetFetchMode('ADODB_FETCH_ASSOC');
$rs = $conn->Execute('SELECT nvarcharfield FROM sometable');
while (!$rs->EOF) { 
    echo $rs->fields['nvarcharfield'], "\n";
    $rs->MoveNext();
} 
$rs->Close();

ADODB kullanarak, ADOdb hazırlanan sorgular yazmak ve anlamak çok daha kolay.

SQL Server 2008 yeni SQL Native Client varsa, "SQLNCLI10" ile sağlayıcı "SQLNCLI" değiştirmek isteyebilirsiniz.

En kısa zamanda ben bazı ünü almak gibi, ben bağlantıları inline (yeni kullanıcılar için izin verilen tek köprü) ekleyeceğiz.

http://devzone.zend.com/article/4906-Zend-Framework-1.9.0-Released
http://msdn.microsoft.com/de-de/library/system.data.oledb.oledbcommand.prepare.aspx
http://adodb.sourceforge.net/
http://phplens.com/lens/adodb/docs-adodb.htm#prepare