Проблемы с подключением к PHP / PDO и SQL Server, а также проблемы с i18n - PullRequest
5 голосов
/ 07 октября 2008

В нашем веб-приложении мы используем PHP5.2.6 + PDO для подключения к базе данных SQL Server 2005 и хранения русских текстов.

Сортировка базы данных Cyrillic_General_CI_AS, сортировка таблицы Cyrillic_General_CI_AS, тип столбца NVARCHAR(MAX).

Мы попытались подключиться к базе данных по двум следующим схемам, каждая из которых вызывала различные проблемы.

  1. ЗОП mssql:

    $dbh = new PDO ('mssql:host='.$mssql_server.';dbname='.$mssql_db, $mssql_login, $mssql_pwd);
    

    в этом случае результат простого запроса, подобного этому:

    SELECT field1 FROM tbl1 WHERE id=1
    

    показывает field1 данные, усеченные до 255 байтов.

  2. PDO odbc:

    $dbh = new PDO ('odbc:DSN=myDSN;UID='.$mssql_login.';PWD='.$mssql_pwd);
    

    В этом случае результат того же запроса показывает полные не усеченные данные, а с русскими знаками вместо русских символов.


Примечания:

  • В SQL Management Studio данные не усекаются, и русские символы также отображаются правильно.
  • У нас есть Windows 2003 Enterprise Edition SP2

Так что мы должны выбрать в качестве метода подключения и как исправить соответствующие проблемы?

Ответы [ 5 ]

2 голосов
/ 13 октября 2008

Попробуйте выполнить SET NAMES "charset" после подключения.

Я не знаю, что такое кодировка для сопоставления Cyrillic_General_CI_AS, но попробуйте "Кириллица"?

1 голос
/ 26 февраля 2010

Я должен был сделать это, чтобы получить полезные данные из моих полей NVARCHAR в MSSQL:

$_ = iconv('Windows-1252', 'UTF-8', $_);
0 голосов
/ 22 мая 2009

Я также заметил ту же проблему с реализацией SQL Server 2005 и PHP 5.x с использованием PDO. Когда я изменил поле nvarchar (MAX) на nvarchar (255), перестали появляться символы нечетного знака вопроса. Я определенно верю, что это связано с драйверами ODBC в PDO и MS SQL-сервере. Когда вы неявно указываете максимальное количество символов в вашем varchar, это решает проблему.

0 голосов
/ 14 октября 2008

Если вы не настроены на PDO, используйте FreeTDS - так называемые процедурные вызовы mssql_ *. Это один из рекомендуемых способов обхода до тех пор, пока PDO не станет фиксированным . Начиная с PHP 5.1.2, FreeTDS имеет mssql.charset-option .

0 голосов
/ 07 октября 2008

Мне всегда везло, используя utf8_general_ci по всем направлениям - для соединений, сопоставлений - всего.

Тем не менее, я имею опыт работы только с MySQL и PostgreSql, но не с SQL Server.

Что касается вашего вопроса DSN - я не уверен.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...