PHP + SQL Server - bağlantısı için charset nasıl ayarlanır?

6 Cevap php

Ben php ile bir SQL Server veritabanında bazı verileri depolamak için çalışıyorum.

Problem is that special chars aren't converted properly. My app's charset is iso-8859-1 and the one used by the server is windows-1252.

Converting the data manually before inserting doesn't help, there seems to be some conversion going on.

SQL sorgusu çalıştıran ya da yardımcı olmuyor 'char_convert yola'.

Herkes bu işe nasıl bir fikrin var mı?

EDIT: I ('windows-1252', 'mssql.charset') ini_set denedim; de, ama o da biri ile sonuç yok.

6 Cevap

Müşteri charset gerekli ama yeterli değildir:

ini_set('mssql.charset', 'UTF-8');

I searched for two days how to insert UTF-8 data (from web forms) into MSSQL 2008 through PHP. I read everywhere that you can't, you need to convert to UCS2 first (like cypher's solution recommends). On Windows SQLSRV said to be a good solution, which I couldn't try, since I am developing on Mac OSX.

Ancak, freetds manuel (ne PHP mssql OSX kullandığı) açılış teklifi önce "N" harfi eklemek için diyor ki:

mssql_query("INSERT INTO table (nvarcharField) VALUES (N'űáúőűá球最大的采购批发平台')", +xon);

According to this discussion, N character tells the server to convert to Unicode. http://programmers.stackexchange.com/questions/155859/why-do-we-need-to-put-n-before-strings-in-microsoft-sql-server

Ben şu noktalarda bakarak öneririm:

  1. Eğer bilgiyi depolamak sütunlar nchar veya nvarchar karakter ve nvarchar desteklemez UCS-2 (SQL Server içinde saklamak değil emin olun UTF-8 biçimi btw)
  2. PHP için mssql library/extension ile bağlanıyorsanız, çalıştırın: ini_set('mssql.charset', 'utf-8'); charset argüman ile hiçbir işlevi yok gibi (connect, query, vb)
  3. Tarayıcınızın charset sağlamak da UTF-8 ayarlanır

Yukarıda TDS protokol sürüm 7 veya kullanıyorsanız, tel üzerinde TÜM iletişim UCS2 dönüştürülür. Sütun nvarchar veya ntext sürece sunucu, tablo veya sütun harmanlama için ayarlanmış olursa olsun içine UCS2 dönüştürmek olacaktır. Sen can mağaza UTF-8 normal varchar veya metnin içine, sadece 6.0 veya 4.2 gibi, 7 daha düşük bir TDS protokol sürümünü kullanmak zorunda. Bu yöntemle tek dezavantajı, herhangi bir nvarchar, Ntext veya sys sorgulamak değil ki * tablolar (ben de () ing herhangi CAST yapamaz düşünüyorum) -. Sunucu muhtemelen dönüştürülebilir olabilir bir şey göndermek için reddediyor gibi UTF-8 protokolü sürümünü 7 daha düşük kullanarak herhangi bir istemci.

Bu (kabaca MSSQL 2005 eşdeğer veya daha yeni) TDS protokolü sürüm 7 veya daha yüksek kullanırken karakter setlerini dönüştürme önlemek mümkün değildir.

Eğer sadece uygulama kodlama için tabloları dönüştürmek değil mi? Ya da her ikisi de UTF-8 kullanmak?

MSSQL tablo düzey kodlamalarını destekler olmadığını biliyorum, ama bilmiyorum.

Yukarıdaki başarısız olursa Ayrıca, MB (Çokbaytlı) dize işlevlerini deneyebilirsiniz.

Ben çıktı yazdırmadan önce kodlama dönüştürmek için aşağıdaki kodu kullanarak (bir PDO ODBD bağlantısını kullanarak) benzer bir durumda şans yaşadım:

$data = mb_convert_encoding($data, 'ISO-8859-1', 'windows-1252');

Ben yanlışlıkla mb_detect_encoding() tarafından 'ISO-8859-1' olarak rapor ediliyor çünkü elle, kaynak kodlamasını ayarlamak zorunda.

Umarım işe yarar olmasına rağmen, benim veri başka bir uygulama tarafından veritabanında saklanan ediliyordu, bu yüzden benzersiz bir durum olabilir!

I resolved it by passing the array from utf8_encode function and then json_encode. This link helped.

http://www.php.net/manual/en/function.json-encode.php#106417