【问题标题】:php 5.6 - connecting at oracle DB using pdo and specify charset/encodingphp 5.6 - 使用 pdo 在 oracle DB 连接并指定字符集/编码
【发布时间】:2017-06-10 03:02:48
【问题描述】:

我不确定我可能会丢失什么,但目前使用此工作代码我能够正确连接、查询和返回 db 表中的结果。

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

Bellow,到目前为止我拥有的所有信息,但我认为必须在 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>';

【问题讨论】:

  • 看起来您的表格字符集是 Windows 1252(基本上是拉丁语 8859-1);您还需要您的表格使用 UTF8。
  • @CD001 我相信我需要更改 php 端,因为不允许更改表的字符集。所以,我会尝试将 php 端更新为拉丁文,看看它是否可以工作。我不确定这是否是正确的方向,您能否详细说明一下,以便我能更好地理解? =)
  • 这应该行得通 - 你很想听从这里的建议:stackoverflow.com/questions/279170/utf-8-all-the-way-through/… ...但将所有内容切换到ISO-8859-1(Windows 1252 是其中的一个子集,所以应该没问题)。
  • 你解决过这个问题吗?
  • @KaKa 遗憾的是,我没有环境来测试这个了,但好消息是,我已获准将整个解决方案迁移到 Django。所以之前的解决方案被停止了。

标签: php pdo


【解决方案1】:

: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 字符。

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 2013-12-14
    • 2015-08-04
    • 2011-09-26
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多