Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann PDO_ODBC keine Zeichen mit UTF-8-Akzent aus Access abrufen?

Warum kann PDO_ODBC keine Zeichen mit UTF-8-Akzent aus Access abrufen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-20 17:52:02793Durchsuche

Why does PDO_ODBC fail to retrieve UTF-8 accented characters from Access?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn