Проблема кодирования символов с PDO_ODBC

При доступе к базе данных 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.

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

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

При настройке кодировки символов на 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); 

Вы можете использовать этот код, чтобы исправить свою проблему:

 $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; } 

Вы можете использовать этот код, чтобы исправить свою проблему:

Первичные данные

 '$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";