>  기사  >  백엔드 개발  >  PDO_ODBC가 Access에서 UTF-8 악센트 ​​문자를 검색하지 못하는 이유는 무엇입니까?

PDO_ODBC가 Access에서 UTF-8 악센트 ​​문자를 검색하지 못하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-20 17:52:02789검색

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

PDO_ODBC가 Access UTF-8 악센트 ​​문자를 검색하지 못했습니다.

문제 설명

다음을 시도하세요. Access를 사용하여 데이터베이스를 MySQL로 변환하면 모든 것이 잘 작동하지만 심각한 문제가 발생합니다. Access 데이터베이스에 비표준 문자가 포함되어 있으면 변환이 실패합니다. 쿼리는 다음 오류를 반환합니다.

Incorrect string value: '\xE9d'

"잘못된" 문자가 포함된 텍스트 줄을 직접 출력하면 브라우저는 검은색 사각형 안에 물음표를 표시합니다(따라서 é는 잘못된 기호가 됩니다).

참고: 이 데이터베이스 업로드 제목의 텍스트 상자에 "é"를 수락, 저장 및 표시하는 데 동일한 양식이 잘 작동합니다. 또한 페이지를 "다른 이름으로 저장"하고 다시 열면 "é"가 올바르게 표시됩니다.

연결 방법은 다음과 같습니다.

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

다음을 포함한 여러 방법을 시도했습니다.

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

Access에서 "CurrentDb.CollatingOrder"를 시도하면 1033이 표시됩니다. , 분명히 이것은 "영어, 독일어, 프랑스어 및 포르투갈어 정렬 규칙"에 대한 dbSortGeneral입니다.

무슨 일이 있었나요? 내 브라우저와 PHP가 완전히 이해하지 못하는 교정 내용을 PDO가 나에게 보내는 것 같습니다.

문제 해결

1. 간단하지만 불완전한 수정

사실 Access ODBC에서 반환한 텍스트가 ODBC와 다릅니다. Windows 이 문자는 Access 데이터베이스에 유니코드 문자로 저장되어 있더라도 -1252 문자 인코딩과 일치합니다. 따라서 예제 테이블 "Teams"의 경우

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

코드

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

가 브라우저에 표시됩니다

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

2.

수정 UTF-8 전체 지원을 받으려면 ADODB 연결 및 다음과 같은 레코드 세트 개체와 함께 COM을 사용해야 합니다.

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

위 내용은 PDO_ODBC가 Access에서 UTF-8 악센트 ​​문자를 검색하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.