繁体   English   中英

PHP 5.6-使用pdo在Oracle DB上连接并指定字符集/编码

[英]php 5.6 - connecting at oracle DB using pdo and specify charset/encoding

我不确定我可能会缺少什么,但是当前使用此工作代码,我能够正确地连接,查询和返回数据库表中的结果。

但是如何用正确的编码显示表中的结果呢? 由于特殊字符ç和á有时会显示为问号或方框。

贝娄,到目前为止,我已经掌握了所有信息,但是我认为必须在PDO上设置定义,因为如果我只是简单地执行echo "ç -á"; 在页面上,字符将正确显示。

Oracle 11表字符集:

查询: 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>';

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

  • 使用UTF-8作为会话编码创建的数据库会话
  • 根据NLS WE8MSWIN1252设置,数据存储为Windows-1252
  • Oracle将尝试按照数据库会话的UTF-8设置的要求,将列中的原始Windows-1252值转换为等效的UTF-8字符串
  • 当且仅当原始Windows-1252原始字节值正确匹配有效的UTF-8字符(我很确定所有1252个字符都具有有效的UTF-8匹配)时,返回的值才能作为UTF看到。 -8个字符

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM