Th: heeelp... problem z locale (?) przy php, freetds i sybase

Jacek Osiecki joshua w hybrid.pl
Czw, 27 Maj 2010, 11:31:45 CEST


Witam,

Na jednym z serwerów mam problem... nie działa prawidłowo połączenie z
serwerem MSSQL, realizowane przez PHPowe sybase_connect. Wszystko działa,
ale coś jest nie tak z locale albo deklarowanym charsetem, bo pobiera dane
z pytajnikami zamiast polskich literek. Równocześnie ten sam kod na
jakimś starszym serwerze z debianem działa bez zarzutu.

Jak podsłuchiwałem transmisję, to wygląda na to że w obu przypadkach idą
takie same dane - polskie literki są zakodowane w CP-1250. Tyle, że
debianowy php wyświetla je poprawnie, a nasz - wyświetla pytajniki.
Testowałem różne ustawienia locale - normalnie mam POSIX, ale jak ustawiłem
LC_ALL np. pl_PL.ISO-8859-2 albo pl_PL.UTF-8 tudzież en_US.UTF-8 to
absolutnie niczego to nie zmieniało :(

Niestety wersje freetds są różne - u nas libct jest w wersji 4, w debianie w
wersji 3 - więc dumpy wyglądają nieco inaczej. W szczególności, tcpdump na
debianie pięknie pokazuje usera i hasło, a w PLD już nie (przynajmniej nie
jawnie). Ale faktem jest, że w tcpdump na debianie, gdzieś nieco za loginem
i hasłem widzę string "UTF-8" a u nas nie.

Zaglądałem do /etc/tds/locales.conf i widzę że jak zmieniłem:

[default]
   date format = %b %e %Y %I:%M:%S:%z%p
   language = polski
   charset = UTF-8


to tcpdump pokazuje:

         0x00c0:  4800 5000 2000 3500 2e00 3200 2e00 3100  H.P...5...2...1.
         0x00d0:  3300 3100 3000 2e00 3500 3000 2e00 3000  3.1.0...5.0...0.
         0x00e0:  2e00 3900 3000 4300 5400 2d00 4c00 6900  ..9.0.C.T.-.L.i.
         0x00f0:  6200 7200 6100 7200 7900 7000 6f00 6c00  b.r.a.r.y.p.o.l.
         0x0100:  7300 6b00 6900                           s.k.i.

(dane wysyłane DO serwera mssql).
Ale tego UTF-8 nadal nie ma.

Wszystko na PLD w aktualnych wersjach. Dostęp do mssql za pomocą php-sybase_ct.
Dla pewności testowałem za pomocą php.cli - żeby nie mógł tu w pokazywaniu
znaczków  mieszać sam apache...

Poniżej kod:

ini_set("display_errors","on");
$connect = sybase_connect("192.158.77.10", "xxxx", "xxxx","UTF-8");
sybase_select_db("TEST", $connect);
$query = 'SET CONCAT_NULL_YIELDS_NULL ON;
     SET ANSI_WARNINGS ON;
     SET ANSI_PADDING ON;
     SET ARITHABORT ON;
     SET LANGUAGE POLISH;
     SET DATEFORMAT DMY;
     SET DATEFIRST 1;
     SET TEXTSIZE 64512;
';
$result = sybase_query($query, $connect);
$query = "SELECT SERVERPROPERTY('Collation');";
$result = sybase_query($query, $connect);
while($row=sybase_fetch_row($result)) {
   print $row[0]."\n";
}
$query = "SELECT ID, Name, FirstName FROM [dbo].[fnRSOConsulters] (1) ORDER BY Name;";
$result = sybase_query($query, $connect);
while($row=sybase_fetch_row($result)) {
     print $row[1]. ' ' . $row[2] . '<br>'."\n";
}
sybase_close($connect);

... i efetkt:

SQL_Polish_CP1250_CI_AS
Domaszczy?ski Jacek<br>
G?golewski Przemys?aw<br>
Ko?bia? Daniel<br>
?urawski Micha?<br>

zamiast:

SQL_Polish_CP1250_CI_AS
Domaszczyński Jacek<br>
Gągolewski Przemysław<br>
Koźbiał Daniel<br>
Żurawski Michał<br>

Jakieś pomysły? Rzecz dosyć poważna, klient się wścieka bo przed przesiadką
"wszystko działało" :-/

Pozdrawiam,
-- 
Jacek Osiecki joshua w ceti.pl GG:3828944
I don't want something I need. I want something I want.


Więcej informacji o liście dyskusyjnej pld-users-pl