Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah PDO_ODBC gagal mendapatkan semula aksara beraksen UTF-8 daripada Access?

Mengapakah PDO_ODBC gagal mendapatkan semula aksara beraksen UTF-8 daripada Access?

Barbara Streisand
Barbara Streisandasal
2024-10-20 17:52:02793semak imbas

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

PDO_ODBC gagal mendapatkan akses aksara beraksen UTF-8

Penerangan Masalah

Cuba gunakan Access Menukar pangkalan data kepada MySQL, semuanya berfungsi dengan baik, tetapi saya menghadapi masalah besar: jika pangkalan data Access mengandungi sebarang aksara bukan standard, penukaran gagal. Pertanyaan mengembalikan ralat berikut:

Incorrect string value: '\xE9d'

Apabila mengeluarkan terus baris teks dengan aksara "tidak sah", penyemak imbas memaparkan tanda soal dalam segi empat sama hitam (jadi é menjadi simbol tidak sah ini).

Nota: Borang yang sama berfungsi dengan baik untuk menerima, menyimpan dan memaparkan "é" dalam kotak teks untuk tajuk muat naik pangkalan data ini. Selain itu, jika saya "simpan sebagai" halaman dan membukanya semula, "é" dipaparkan dengan betul.

Begini cara untuk menyambung:

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

Telah mencuba pelbagai kaedah termasuk:

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

Apabila mencuba "CurrentDb.CollatingOrder" dalam Access, ia mendapat Ia menunjukkan 1033 , nampaknya ini adalah dbSortGeneral untuk "peraturan pengisihan bahasa Inggeris, Jerman, Perancis dan Portugis".

Apa yang berlaku? Rasanya PDO menghantar saya pruf yang pelayar dan PHP saya tidak faham sepenuhnya.

Masalah Selesai

1 Pembetulan ringkas tetapi tidak lengkap

Malah, teks yang dikembalikan oleh Access ODBC berbeza daripada. Windows Watak ini sepadan dengan pengekodan aksara -1252, walaupun ia disimpan dalam pangkalan data Access sebagai aksara Unikod. Jadi untuk jadual contoh "Pasukan",

Team
-----------------------
Boston Bruins
Canadiens de Montréal
Федерация хоккея России

kod

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

akan dipaparkan dalam penyemak imbas

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

Lengkap Betulkan

Untuk mendapatkan sokongan penuh UTF-8 kita perlu menggunakan COM dengan sambungan ADODB dan objek set rekod seperti ini:

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

Atas ialah kandungan terperinci Mengapakah PDO_ODBC gagal mendapatkan semula aksara beraksen UTF-8 daripada Access?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn