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

Barbara Streisand
Libérer: 2024-10-20 17:52:02
original
789 Les gens l'ont consulté

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'
Copier après la connexion

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;");
Copier après la connexion

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

$conn -> exec("set names utf8");
Copier après la connexion

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
Федерация хоккея России
Copier après la connexion

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>
Copier après la connexion

sera affiché dans le navigateur

Boston Bruins
Canadiens de Montr�al
????????? ?????? ??????
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!