Maison  >  Article  >  développement back-end  >  Pourquoi PDO_ODBC ne parvient-il pas à récupérer les caractères accentués UTF-8 depuis Access ?

Pourquoi PDO_ODBC ne parvient-il pas à récupérer les caractères accentués UTF-8 depuis Access ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-20 17:52:02793parcourir

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

PDO_ODBC n'a pas réussi à récupérer les caractères accentués Access UTF-8

Description du problème

Essayez de utiliser Access Conversion de la base de données en MySQL, tout fonctionne bien, mais je rencontre un problème majeur : si la base de données Access contient des caractères non standard, la conversion échoue. La requête renvoie l'erreur suivante :

Incorrect string value: '\xE9d'

Lors de la sortie directe d'une ligne de texte avec des caractères "invalides", le navigateur affiche un point d'interrogation dans un carré noir (le é devient donc ce symbole invalide).

Remarque : Le même formulaire fonctionne très bien pour accepter, enregistrer et afficher le "é" dans la zone de texte du titre de ce téléchargement de base de données. De plus, si je "enregistre sous" la page et que je la rouvre, le "é" s'affiche correctement.

Voici comment se connecter :

$conn = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$fileLocation;SystemDB=$securefilePath;Uid=developer;Pwd=pass;charset=utf;");

J'ai essayé plusieurs méthodes, notamment :

$conn -> exec("set names utf8");

Lorsque vous essayez "CurrentDb.CollatingOrder" dans Access, il obtient Il affiche 1033 , apparemment, il s'agit de dbSortGeneral pour "règles de tri en anglais, allemand, français et portugais".

Qu'est-ce qui n'a pas fonctionné ? J'ai l'impression que PDO m'envoie une relecture que mon navigateur et PHP ne comprennent pas entièrement.

Problème résolu

1. Solution simple mais incomplète

En fait, le texte renvoyé par Access ODBC est différent de Windows Ce caractère correspond au codage de caractères -1252, même s'il est stocké dans la base de données Access en tant que caractère Unicode. Ainsi pour l'exemple de tableau "Équipes", le

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>

sera affiché dans le navigateur

Boston Bruins
Canadiens de Montr�al
????????? ?????? ??????

Complet. Correctif

Pour obtenir une prise en charge complète de UTF-8, nous devons utiliser COM avec une connexion ADODB et un objet recordset comme celui-ci :

<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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn