freebsd + php + freetds + mssql - проблема с кодировкой

Mechanik

Новичок
freebsd + php + freetds + mssql - проблема с кодировкой

Сервер работает под управлением FreeBSD 4.7, установлен Apache 1.3.28, php 4.3.3; php работает с mssql-сервером (2005) через freetds 0.62.4.
В кофигурации (freetds.conf)

PHP:
[mymssql]
host = 192.168.0.3
port = 1433
tds version = 4.2
есть проблема с получением строк длиной более 255 символов - они обрезаются.
Изменяем протокол freetds
PHP:
[mymssql]
host = 192.168.0.3
port = 1433
tds version = 8.0
- получаем проблему с перекодированием непонятно во что русских символов в запросах, уходящих на mssql (при чтении - все в порядке).
Тут http://freetds.org/userguide/freetdsconf.htm про это написано
client charset
Makes FreeTDS use iconv to convert to and from the specified character set from UCS-2 in TDS 7.0/8.0. As of 0.62 FreeTDS uses iconv to convert all character data, so there's no need to match the server's charset to insert any characters the server supports.
any valid iconv character set
Ладно, вдобавок начитавшись про подобные проблемы, изменяем конфигурацию следующим образом:
PHP:
[mymssql]
host = 192.168.0.3
port = 1433
tds version = 8.0
client charset = CP1251
тогда перестает соединяться вовсе:
PHP:
 $con = mssql_connect("mymssql","user","password");
дает
Warning: mssql_connect(): Unable to connect to server: mymssql in ...
Вот лог freetds
Starting log file for FreeTDS 0.62.4
on 2006-12-07 06:36:32 with debug level 99.
iconv to convert client-side data to the "CP1251" character set
06:36:32.224758 tds_iconv_info_init: use memcpy to convert "CP1251"->"UCS-2LE"
06:36:32.224794 Connecting to 192.168.0.3 port 1433, TDS 8.0.
06:36:32.225048 tds_put_string converting 8 bytes of "myhost.ru"
06:36:32.225077 tds_put_string wrote 8 bytes
06:36:32.225099 tds_put_string converting 2 bytes of "user"
06:36:32.225121 tds_put_string wrote 2 bytes
06:36:32.225143 tds_put_string converting 7 bytes of "PHP 4.0"
06:36:32.225166 tds_put_string wrote 7 bytes
06:36:32.225187 tds_put_string converting 6 bytes of "mymssql"
06:36:32.225209 tds_put_string wrote 6 bytes
06:36:32.225229 tds_put_string converting 10 bytes of "DB-Library"
06:36:32.225251 tds_put_string wrote 10 bytes
06:36:32.225272 tds_put_string converting 10 bytes of "us_english"
06:36:32.225294 tds_put_string wrote 10 bytes
06:36:32.225315 tds_put_string wrote 0 bytes
06:36:32.225371 tds_process_login_tokens()
06:36:32.225898 tds_client_msg: #20004: "Read from SQL server failed.". Connect
06:36:32.225953 looking for login token, got 0()
06:36:32.225979 tds_process_default_tokens() marker is 0()
06:36:32.226001 leaving tds_process_default_tokens() connection dead
06:36:32.226026 tds_client_msg: #20014: "Login incorrect.". Connection state is
06:36:32.226445 in dbfreebuf()
06:36:32.231811 in dbfreebuf()
06:36:32.523644 UNIMPLEMENTED dbsettime()
06:36:32.523684 UNTESTED dbsetmaxprocs()
На всякий случай
PHP:
root:/usr/local/etc>tsql -C
Compile-time settings (established with the "configure" script):
                           Version: freetds v0.64
    MS db-lib source compatibility: no
       Sybase binary compatibility: unknown
                     Thread safety: yes
                     iconv library: no
                       TDS version: 8.0
                             iODBC: no
                          unixodbc: no
root:/usr/local/etc>
Утилиту tsql подружить с 2005-м mssql так и не удалось:
PHP:
root:/usr/local/etc>tsql -S Ratiss -U sa
locale is "ru_RU.KOI8-R"
locale charset is "KOI8-R"
Password:
Msg 20004, Level 9, State 0, Server OpenClient, Line 0
Read from SQL server failed.
Msg 20014, Level 9, State 0, Server OpenClient, Line 0
Login incorrect.
There was a problem connecting to the server
хотя с 2000-м все работало.
В *nix я не силен, может что простое... Локаль cp1251 вроде установлена.
Что можно попытаться предпринять для нормальной работы?

-~{}~ 07.12.06 23:41:

Установил freetds 0.64 - по крайней мере, tsql работает с 2005-м сервером.
Буду с ним собирать последний php.
 

Alexandre

PHPПенсионер
хотя с 2000-м все работало.
В *nix я не силен, может что простое... Локаль cp1251 вроде установлена.

Установил freetds 0.64 - по крайней мере, tsql работает с 2005-м сервером.
у меня с с 2000-м Проблем не было,
а 2005 требует кодировку UTF-8.
мне кажется проблемы в самом драйвере freetds

хотя я логинюсь нормально, как из freetds , так и из пхп,
но много времени убил на перекодировку.
Остается дождаться пхп-6, где все внутреннее представление будет в UTF-8
может и проблемы отпадуут...
 

Mechanik

Новичок
Автор оригинала: Alexandre
у меня с с 2000-м Проблем не было,
а 2005 требует кодировку UTF-8.
мне кажется проблемы в самом драйвере freetds

хотя я логинюсь нормально, как из freetds , так и из пхп,
но много времени убил на перекодировку.
Остается дождаться пхп-6, где все внутреннее представление будет в UTF-8
может и проблемы отпадуут...
дело, похоже, действительно в драйвере... А как именно решался вопрос с перекодировкой? Если не коммерческая тайна :)
Пока собираю мысль лезть в исходники...

-~{}~ 09.12.06 17:27:

Победил.
Дело оказалось в том, что freetds не видел в /usr/local/lib библиотеки iconv - libiconv.so, посему работал со своим iconv, у которого только 2 кодировки
TDS 7.0 for Nonwestern Languages
no iconv library is found, or if it is explicitly disabled, FreeTDS will use its built-in iconv substitute, and will be capable of converting between only ISO-8859-1 and UCS-2.
В итоге пересобрал freetds с ключами
PHP:
./configure --with-tdsver=8.0 --with-libiconv-prefix=/usr/local --prefix=/usr/local
получил
PHP:
bash$ tsql -C
Compile-time settings (established with the "configure" script):
                           Version: freetds v0.64
    MS db-lib source compatibility: no
       Sybase binary compatibility: unknown
                     Thread safety: yes
                     iconv library: yes
                       TDS version: 8.0
                             iODBC: no
                          unixodbc: no
и с конфигурацией
PHP:
[myserver]
       host = 192.168.0.3 
       port = 1433 
       tds version = 7.0
       client charset = CP1251
все заработало коректно! Отправляет запросы правильно, и возвращает длинные (>255) строки!
 
Сверху