Проблема кодировки символов с PDO_ODBC - PullRequest
7 голосов
/ 12 августа 2010

При доступе к базе данных Microsoft SQL из PHP с использованием PDO_ODBC с помощью следующего кода у меня возникает проблема с кодировкой.При выводе текста из БД искажается.

$dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;charset=UTF-8";
$pdo = new PDO($dsn,$username,$password);
$sql = "SELECT text FROM atable";
$result = $PDO->query($sql);
while($data = $result->fetchObject()){
  $values[] = $data->text; 
}
dpm($values);

искаженный вывод http://image.bayimg.com/naomcaacd.jpg

Это делается из модуля Drupal.Все в Drupal сделано для работы с UTF-8.Самым чистым решением было бы получить данные из базы данных в UTF-8 или преобразовать их в UTF-8 перед выводом.

Я пробовал это безуспешно

  • $dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;client_charset=utf-8"
  • $dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;charset=utf-8"
  • $pdo->exec('SET NAMES utf8') после new PDO(...)
  • $pdo->exec('SET CHARACTER SET utf8'); после new PDO(...)

PS: Код в настоящее время разрабатывается в Windows, но он также должен работать и в GNU / Linux.

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

При работе в Linux и использовании драйвера FreeTDS кодировка для клиента может быть настроена с параметром client charset в файле freetds.conf.Чтобы использовать файл freetds.conf при использовании PDO ODBC и unixODBC, необходимо настроить источник данных ODBC, используя ODBC-комбинированная конфигурация .Если для конфигурации источника данных ODBC используется ODBC-only конфигурация , файл freetds.conf не используется.Благодаря этому я смог извлечь и вставить данные UTF-8 из / в базу данных MS SQL Server.

Будучи парнем из Linux / Unix, я не смог понять / найти способ настройки используемой кодировкикогда PDO ODBC используется в Windows.Я смутно понимаю, что при настройке на системном уровне источник данных ODBC можно настроить для использования либо набора символов базы данных SQL Server, либо преобразования в набор символов клиентского компьютера.

1 голос
/ 06 декабря 2011

При установке кодировки символов на UTF-8 вам также необходимо будет кодировать ваши запросы как UTF-8 и декодировать результаты. Кодировка сообщает водителю, что вы говорите по-UTF8. Таким образом, вам нужно преобразовать UTF8 обратно в то, что понимает PHP (ASCII или mbstring).

$dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;charset=UTF-8";
$pdo = new PDO($dsn,$username,$password);
$sql = utf8_encode("SELECT text FROM atable");
$result = $PDO->query($sql);
while($data = $result->fetchObject()){
  $values[] = utf8_decode($data->text); 
  // possibly also: $values[] = utf8_decode($data[utf8_encode('text')]);
}
dpm($values);
0 голосов
/ 05 марта 2017

Вы можете использовать этот код для решения вашей проблемы:

Преобразование данных первого сообщения

'$word = iconv("UTF-8","Windows-1254",$_POST['search']);'

И преобразование чтения данных

while($data = $result->fetchObject()){
  $values[] = iconv("Windows-1254", "UTF-8",$data->text));
}

Строка SQL

$sql = "SELECT * FROM yourtables WHERE text LIKE '%{$word}%'";
or
$sql = "SELECT * FROM yourtables";
0 голосов
/ 01 июня 2016

Вы можете использовать этот код для решения вашей проблемы:

$result = odbc_exec($this->con, $sql);    
$data = fetch2Array($result);

 private function fetch2Array($result){    
    $rows = array();

    while($myRow = odbc_fetch_array( $result )){ 
        $rows[] = $this->arrayToUTF($myRow);
    }
    return $rows;
}

private function arrayToUTF($arr){
    foreach ($arr as $key => $value) {
        $arr[$key] = utf8_encode($value);
    }
    return $arr;
}
...