PHP + SQL Server - Как установить кодировку для соединения?
Я пытаюсь сохранить некоторые данные в базе данных SQL Server с помощью php.
Проблема в том, что специальные символы не преобразуются должным образом. Мое приложение charset iso-8859-1
и тот, который используется сервером, - это windows-1252.
Преобразование данных вручную перед вставкой не помогает, кажется, что некоторые
конверсия происходит.
Запуск SQL-запроса "set char_convert off" не помогает.
Кто-нибудь знает, как я могу заставить это работать?
EDIT: Я пробовал ini_set ('mssql.charset', 'windows-1252'); также, но результата нет и с этим.
Ответы
Ответ 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')));
Ответ 11
Вы можете использовать функцию mysql_set_charset:
http://it2.php.net/manual/en/function.mysql-set-charset.php