PDO_ODBC konnte Access UTF-8-Akzentzeichen nicht abrufen
Problembeschreibung
Versuchen Sie es Verwenden Sie Access. Konvertieren Sie die Datenbank in MySQL. Alles funktioniert einwandfrei, aber ich stoße auf ein großes Problem: Wenn die Access-Datenbank nicht standardmäßige Zeichen enthält, schlägt die Konvertierung fehl. Die Abfrage gibt den folgenden Fehler zurück:
Incorrect string value: '\xE9d'
Bei der direkten Ausgabe einer Textzeile mit „ungültigen“ Zeichen zeigt der Browser ein Fragezeichen in einem schwarzen Quadrat an (das é wird also zu diesem ungültigen Symbol).
Hinweis: Das gleiche Formular funktioniert gut, um das „é“ im Textfeld für den Titel dieses Datenbank-Uploads zu akzeptieren, zu speichern und anzuzeigen. Auch wenn ich die Seite „speichere unter“ und sie erneut öffne, wird das „é“ korrekt angezeigt.
So stellen Sie eine Verbindung her:
$conn = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$fileLocation;SystemDB=$securefilePath;Uid=developer;Pwd=pass;charset=utf;");
Habe mehrere Methoden ausprobiert, darunter:
$conn -> exec("set names utf8");
Beim Versuch „CurrentDb.CollatingOrder“ in Access wird 1033 angezeigt , anscheinend ist dies dbSortGeneral für „Sortierregeln für Englisch, Deutsch, Französisch und Portugiesisch“.
Was ist schief gelaufen? Es fühlt sich an, als würde mir PDO eine Korrekturlesung schicken, die mein Browser und PHP nicht vollständig verstehen.
Problem gelöst
1. Einfache, aber unvollständige Lösung
Tatsächlich unterscheidet sich der von Access ODBC zurückgegebene Text Windows Dieses Zeichen entspricht der Zeichenkodierung -1252, obwohl es in der Access-Datenbank als Unicode-Zeichen gespeichert ist. Für die Beispieltabelle „Teams“ wird also der
Team ----------------------- Boston Bruins Canadiens de Montréal Федерация хоккея России
Code
<code class="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></code>
im Browser angezeigt
Boston Bruins Canadiens de Montr�al ????????? ?????? ??????
2 Fix
Um volle UTF-8-Unterstützung zu erhalten, müssen wir COM mit einer ADODB-Verbindung und einem Recordset-Objekt wie diesem verwenden:
<code class="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></code>
Das obige ist der detaillierte Inhalt vonWarum kann PDO_ODBC keine Zeichen mit UTF-8-Akzent aus Access abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!