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

Получение данных с кодировкой UTF-8 с сервера MSSQL с использованием расширения PHP FreeTDS

Я не могу получить данные из MSSQL, закодированные как UTF-8, используя расширение FreeTDS.

Подключение:

ini_set('mssql.charset', 'UTF-8');
$this->_resource = mssql_connect($config['servername'], $config['username'], $config['password']);

У меня нет возможности использовать какое-либо другое расширение.

Я пробовал создать файл ~/.freetds.conf

[global]
client charset = UTF-8

Я пробовал передавать параметры в php:

php -d mssql.charset="UTF-8" index.php

Данные по-прежнему отсутствуют в UTF-8.

php -i

mssql

MSSQL Support => enabled
Active Persistent Links => 0
Active Links => 0
Library version => FreeTDS

Directive => Local Value => Master Value
mssql.allow_persistent => On => On
mssql.batchsize => 0 => 0
mssql.charset => no value => no value
mssql.compatability_mode => Off => Off
mssql.connect_timeout => 5 => 5
mssql.datetimeconvert => On => On
mssql.max_links => Unlimited => Unlimited
mssql.max_persistent => Unlimited => Unlimited

Идеи?

4b9b3361

Ответ 1

MSSQL и UTF-8 довольно болезненны... иногда. Я должен был преобразовать это вручную. Проблема: MSSQL фактически не знает и не поддерживает UTF-8.

Преобразовать из значения базы данных в UTF-8:

mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8' ? $value : mb_convert_encoding($value, 'UTF-8');

Преобразование из UTF-8 в значение базы данных:

mb_convert_encoding($value, 'UCS-2LE', mb_detect_encoding($value, mb_detect_order(), true));

К счастью, я использовал Doctrine, поэтому все, что у меня было, это создать собственную реализацию StringType.

Ответ 2

У меня была аналогичная проблема, и я пробовал все настройки, которые я мог найти в Интернете - зря.

В моем случае проблема заключалась в настройке самого FreeTDS. В Linux файл:/etc/freetds/freetds.conf

Мне пришлось изменить версию на 7.0 (возможно, другие числа тоже работают. Я просто попробовал 7.0)

[global]
    # TDS protocol version
    tds version = 7.0

После этого драйвер, похоже, принял изменения в кодировке типа.

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

Btw: изменение немедленно действует, не нужно ничего перезапускать

Ответ 3

Если вы используете freeTDS, вы должны изменить строки ниже на /etc/freetds/freetds.conf:

[global]
# TDS protocol version
tds version = 4.2

Для этого:

[global]
# TDS protocol version
tds version = 8.0
;tds version = 4.2

и, наконец, добавьте эту строку:

# set charset
client charset = UTF-8

** charset клиники находится в глобальном [scope]

В ваших запросах вы должны использовать символ N. например:

$query = "INSERT INTO dbo.SMSOutbox (StationID, Dest, Text) VALUES ";
   $query .= '(';
   $query .= "'" . $this->stationId . "', ";
   $query .= "'" . $this->destination . "', ";
   $query .= "N'" . $this->text . "'";
   $query .= ')';

Ответ 4

Вы также можете решить эту проблему, добавив CharacterSet UTF-8 в $connectionInfo перед подключением к БД.

$serverName = "MyServer";
$connectionInfo = array( "Database"=>"AdventureWorks", "CharacterSet" => "UTF-8");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

Работает нормально, нет необходимости в дополнительной кодировке.

Ответ 5

У меня возникла эта проблема, и она была решена путем добавления этой строки к моему php script перед подключением к MSSQL Server:

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

Ответ 6

Кажется, что версия 7.0 или большая. iconv() также работает хорошо, но утомительно.

$query = $this->db->query($sql);
$result = $query->fetchAll(PDO::FETCH_OBJ);
foreach ($result as $row) {
    foreach (get_object_vars($row) as $key => $value) {
    $row->$key = (mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8') 
            ? $value : iconv('iso-8859-1', 'utf-8', $value);
    }
    $results[] = $row;
}

Ответ 7

Вы должны изменить свою версию TDS на основе той версии SQL-сервера, которую вы используете. Подробнее см. Руководство по установке.

http://www.freetds.org/userguide/choosingtdsprotocol.htm