В нашем веб-приложении мы используем PHP5.2.6 + PDO для подключения к базе данных SQL Server 2005 и хранения русских текстов.
Сортировка базы данных - Cyrillic_General_CI_AS, сортировка таблицы - Cyrillic_General_CI_AS, тип столбца - NVARCHAR(MAX).
Мы попытались подключиться к базе данных, используя две следующие схемы, обе вызывали разные проблемы.
PDO mssql:
$dbh = new PDO ('mssql:host='.$mssql_server.';dbname='.$mssql_db, $mssql_login, $mssql_pwd);
в этом случае результат такого простого запроса:
SELECT field1 FROM tbl1 WHERE id=1
показывает данные field1, усеченные до 255 байтов.
PDO odbc:
$dbh = new PDO ('odbc:DSN=myDSN;UID='.$mssql_login.';PWD='.$mssql_pwd);
в этом случае результат того же запроса показывает полные не усеченные данные, но с вопросительными знаками вместо русских символов.
Заметки:
Итак, что мы должны выбрать в качестве метода подключения и как исправить соответствующие проблемы?






Мне всегда больше всего везло с использованием utf8_general_ci по всем направлениям - для соединений, сопоставлений - всего.
Однако у меня есть только опыт работы с MySQL и PostgreSql, но не с SQL Server.
Что касается вашего вопроса о DSN - я не уверен.
Удачи!
Попробуйте запустить SET NAMES "charset" после подключения.
Я не знаю, какая кодировка соответствует Cyrillic_General_CI_AS, но попробуйте "кириллицу"?
Если вы не настроены на PDO, используйте FreeTDS - также называемые процедурными вызовами mssql_ *. Это один из рекомендуемых обходных путей, пока PDO не станет фиксированный. Начиная с PHP 5.1.2, FreeTDS имеет mssql.charset-option.
Я заметил ту же проблему с реализацией SQL server 2005 и PHP 5.x с использованием PDO. Когда я изменил поле nvarchar (MAX) на nvarchar (255), нечетные знаки вопроса перестали появляться. Я определенно считаю, что это связано с драйверами ODBC в PDO и MS SQL server. Когда вы неявно указываете максимальное количество символов в своем varchar, это решает проблему.
Мне пришлось сделать это, чтобы получить полезные данные из моих полей NVARCHAR в MSSQL:
$_ = iconv('Windows-1252', 'UTF-8', $_);
Спасибо за ответ, но проблема определенно в PHP / PDO - потому что, когда мы подключаемся к той же базе данных в .NET, все работает нормально.