php 5.6 - 使用pdo在oracle DB上连接并指定charset / encoding

时间:2016-10-04 09:33:40

标签: php pdo

我不确定我可能缺少什么,但是目前使用这个工作代码我能够正确连接,查询和返回db表中的结果。

但是如何用正确的编码显示表中的结果?因为像ç,á这样的特殊字符有时会显示为问号或方框。

贝娄,我到目前为止所有的信息,但我相信必须在PDO上设置定义,因为如果我只是在页面上执行echo "ç -á";,则字符将正确显示。

Oracle 11 Table charset:

查询:SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' ;

结果:WE8MSWIN1252

php.ini文件编码设置:

default_charset = "UTF-8"
internal_encoding = "UTF-8"
input_encoding = "UTF-8"
output_encoding = "UTF-8"

代码示例:

#
# PDO Connect example
#
$tns           = "
(DESCRIPTION=
    (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA=
        (SID=the_database)
    )
)
";
$username = "x";
$password = "x";
try {
    $conn = new PDO("oci:dbname=" . $tns, $username, $password );
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

#
# Fetch results and build html table
#
$sql = "select * table";

$result = $conn->query($sql);
echo '<table>';
echo '<thead>';
echo '<tr>';
echo '<th>Info</th>';
echo '</tr>';
echo '</thead>';
echo '<tbody>';
foreach ($conn->query($sql) as $row) {
    echo '<tr>';
    echo '<td >' . $row['INFO'] . '</td>';
    echo '</tr>';
}
echo '</tbody>';
echo '</table>';

1 个答案:

答案 0 :(得分:0)

:charset=utf8添加到DSN字符串的末尾应该会导致:

  • 使用UTF-8创建的数据库会话作为会话编码
  • 数据存储为Windows-1252,基于NLS WE8MSWIN1252设置
  • Oracle将尝试将列中的原始Windows-1252值转换为数据库会话的UTF-8设置所需的等效UTF-8字符串
  • 当且仅当原始Windows-1252原始字节值正确匹配有效的UTF-8字符时(我非常确定所有1252个字符都有有效的UTF-8匹配),那么返回的值应该作为UTF-8字符
  • 可见

由于您说这些特殊字符的原始echo确实在您的浏览器中正确显示,因此您的“查看器”设置(浏览器)很可能会回显返回的UTF-8字符应该成功。< / p>