Я пытаюсь получить DB Access, преобразованный в MySQL. Все работает отлично, ожидайте один большой ключ обезьяны … Если у доступа db есть какие-то нестандартные символы, это не сработает. Мой запрос скажет мне:
Incorrect string value: '\xE9d'
Если я непосредственно выхожу из текста строк, который имеет «недопустимый» символ, я получаю знак вопроса на черном квадрате в моем браузере (поэтому é превратится в этот неверный символ в эхо).
ПРИМЕЧАНИЕ. То же самое будет принимать, сохранять и отображать «é» fine в текстовом поле, которое используется для заголовка этой загрузки db. Также, если я сохраню как «страницу и снова открою ее, то« é »будет отображаться правильно ….
Вот как я подключаюсь:
$conn = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$fileLocation;SystemDB=$securefilePath;Uid=developer;Pwd=pass;charset=utf;");
Я пробовал много вещей, в том числе:
$conn -> exec("set names utf8");
Когда я пытаюсь использовать «CurrentDb.CollatingOrder» в доступе, он говорит мне, что 1033, по-видимому, является dbSortGeneral для «порядка сортировки английского, немецкого, французского и португальского языков».
Что не так? Это похоже на то, что PDO отправляет мне сортировку моего браузера, а PHP не полностью понимает.
При использовании собственных функций PHP ODBC (PDO_ODBC или более odbc_
функций odbc_
) и драйвера доступа ODBC текст не кодируется в кодировке UTF-8, хотя он хранится в базе данных Access как символы Unicode. Итак, для примера таблицы под названием «Команды»
Team ----------------------- Boston Bruins Canadiens de Montréal Федерация хоккея России
код
<?php header('Content-Type: text/html; charset=utf-8'); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Access character test</title> </head> <body> <?php $connStr = 'odbc:' . 'Driver={Microsoft Access Driver (*.mdb)};' . 'Dbq=C:\\Users\\Public\\__SO\\28311687.mdb;' . 'Uid=Admin;'; $db = new PDO($connStr); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT Team FROM Teams"; foreach ($db->query($sql) as $row) { $s = $row["Team"]; echo $s . "<br/>\n"; } ?> </body> </html>
отображает это в браузере
Boston Bruins Canadiens de Montr al ????????? ?????? ??????
Текст, возвращаемый Access, фактически соответствует кодировке символов Windows-1252 для символов в этом наборе символов, поэтому простое изменение строки
$s = $row["Team"];
в
$s = utf8_encode($row["Team"]);
позволит правильно отобразить вторую запись
Boston Bruins Canadiens de Montréal ????????? ?????? ??????
но функция utf8_encode () преобразуется из ISO-8859-1 , а не из Windows-1252 , поэтому некоторые символы (особенно символ «евро») исчезнут. Лучшим решением было бы использовать
$s = mb_convert_encoding($row["Team"], "UTF-8", "Windows-1252");
но это все равно не решит проблему с третьей записью в нашей примерной таблице.
Для полной поддержки UTF-8 нам необходимо использовать COM с объектами ADODB Connection и Recordset, такими как
<?php header('Content-Type: text/html; charset=utf-8'); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Access character test</title> </head> <body> <?php $connStr = 'Driver={Microsoft Access Driver (*.mdb)};' . 'Dbq=C:\\Users\\Public\\__SO\\28311687.mdb'; $con = new COM("ADODB.Connection", NULL, CP_UTF8); // specify UTF-8 code page $con->Open($connStr); $rst = new COM("ADODB.Recordset"); $sql = "SELECT Team FROM Teams"; $rst->Open($sql, $con, 3, 3); // adOpenStatic, adLockOptimistic while (!$rst->EOF) { $s = $rst->Fields("Team"); echo $s . "<br/>\n"; $rst->MoveNext; } $rst->Close(); $con->Close(); ?> </body> </html>