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