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