Подтвердить что ты не робот

PHP + SQL Server - Как установить кодировку для соединения?

Я пытаюсь сохранить некоторые данные в базе данных SQL Server с помощью php.

Проблема в том, что специальные символы не преобразуются должным образом. Мое приложение charset iso-8859-1 и тот, который используется сервером, - это windows-1252.

Преобразование данных вручную перед вставкой не помогает, кажется, что некоторые конверсия происходит.

Запуск SQL-запроса "set char_convert off" не помогает.

Кто-нибудь знает, как я могу заставить это работать?

EDIT: Я пробовал ini_set ('mssql.charset', 'windows-1252'); также, но результата нет и с этим.

4b9b3361

Ответ 1

Клиентская кодировка необходима, но не достаточна:

ini_set('mssql.charset', 'UTF-8');

Я искал два дня, как вставлять данные UTF-8 (из веб-форм) в MSSQL 2008 через PHP. Я читаю везде, что вы не можете, вам нужно сначала конвертировать в UCS2 (как рекомендует решение cypher). В Windows SQLSRV сказано, что это хорошее решение, которое я не мог попробовать, так как я разрабатываю Mac OSX.

Однако руководство FreeTDS (что использует PHP mssql для OSX) говорит, что перед открывающей цитатой добавить букву "N":

mssql_query("INSERT INTO table (nvarcharField) VALUES (N'űáúőűá球最大的采购批发平台')", +xon);

В соответствии с этим обсуждением символ N указывает серверу преобразовать в Unicode. https://softwareengineering.stackexchange.com/questions/155859/why-do-we-need-to-put-n-before-strings-in-microsoft-sql-server

Ответ 2

У меня была та же проблема, и ini_set('mssql.charset', 'utf-8') не работал у меня. Однако он работал в верхнем регистре:

ini_set('mssql.charset', 'UTF-8');

Ответ 3

Предлагаю взглянуть на следующие моменты:

  • Убедитесь, что столбцы, в которых вы храните информацию, находятся nchar или nvarchar как char, а nvarchar не поддерживают UCS-2 (SQLServer не хранит в формате UTF-8).
  • Если вы подключаетесь к mssql library/extension для PHP, запустите: ini_set('mssql.charset', 'utf-8');, поскольку там нет функции с аргументом charset ( подключение, запрос и т.д.)
  • Убедитесь, что в кодировке ваших браузеров также установлено значение UTF-8

Ответ 4

Если вы используете протокол TDS версии 7 или выше, все коммуникации по кабелю преобразуются в UCS2. Сервер будет конвертировать из UCS2 во все настройки таблицы или столбца, если столбец не является nvarchar или ntext. Вы можете сохранить UTF-8 в обычный varchar или текст, вам просто нужно использовать версию протокола TDS ниже 7, например 6.0 или 4.2. Единственный недостаток этого метода заключается в том, что вы не можете запрашивать таблицы nvarchar, ntext или sys. * (Я думаю, вы также не можете делать CAST() ing), так как сервер отказывается отправлять что-либо, что может быть преобразовано в UTF-8 для любого клиента, использующего версию протокола ниже 7.

Невозможно избежать преобразования наборов символов при использовании протокола TDS версии 7 или выше (примерно эквивалентно MSSQL 2005 или новее).

Ответ 5

Мне повезло в аналогичной ситуации (с использованием соединения PDO ODBD), используя следующий код для преобразования кодировки перед печатью:

$data = mb_convert_encoding($data, 'ISO-8859-1', 'windows-1252');

Мне пришлось вручную установить исходную кодировку, потому что ошибочно сообщалось как "ISO-8859-1" на mb_detect_encoding().

Мои данные также сохранялись в базе данных другим приложением, поэтому я мог бы быть в уникальной ситуации, хотя я надеюсь, что это поможет!

Ответ 6

Для меня редактирование этого файла:
/etc/freetds/freetds.conf
... и изменение/установка параметра "tds version" на "7.0". Отредактируйте файл freetds.conf и попробуйте изменить этот параметр для конфигурации сервера (или глобального).

Он будет работать даже без перезапуска apache.

Ответ 7

Если ini_set('mssql.charset', 'UTF-8'); не помогает И у вас нет доступа root для изменения системного файла freetds.conf, вот что вы можете сделать:

1. Настройте /your/local/freetds.conf файл:

[sqlservername]
    host=192.168.0.56
    port=1433
    tds version=7.0
    client charset=UTF-8

2. Убедитесь, что ваше DSN-соединение использует имя сервера, а не IP:

'dsn' => 'dblib:host=sqlservername;dbname=yourdb

3. Сделать FreeTDS для использования вашего локального файла freetds.conf как непривилегированного пользователя из php script через переменные env:

putenv('FREETDSCONF=/your/local/freetds.conf');

Ответ 8

Не можете ли вы просто преобразовать свои таблицы в кодировку приложения? Или используйте utf-8 в обоих?

Я не знаю, поддерживает ли MSSQL кодировки на уровне таблицы.

Кроме того, попробуйте использовать строковые функции MB (multibyte), если вышеуказанное не работает.

Ответ 9

Перед подключением следует установить кодировку с ini_set ('mssql.charset', 'windows-1252'). Если вы используете его после mssql_connect, он не имеет эффекта.

Ответ 10

Просто добавление ini_set('mssql.charset', 'UTF-8'); не помогло мне в моем случае. Я должен был указать набор символов UTF-8 в столбце:

$age = 30;  
$name = utf8_encode("Joe");    

$select = sqlsrv_query($conn, "SELECT * FROM Users WHERE Age = ? AND Name = ?",
    array(array($age), array($name, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('UTF-8')));