Подключение PHP / PDO и SQL Server и проблемы с i18n

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

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

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

  1. 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 байтов.

  2. PDO odbc:

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

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


Заметки:

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
0
4 721
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

Удачи!

Спасибо за ответ, но проблема определенно в PHP / PDO - потому что, когда мы подключаемся к той же базе данных в .NET, все работает нормально.

Vitaly Sharovatov 08.10.2008 10:15
Ответ принят как подходящий

Попробуйте запустить 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', $_);

Другие вопросы по теме