【问题标题】:PHP ODBC connection to Oracle, no UTF-8PHP ODBC 连接到 Oracle,没有 UTF-8
【发布时间】:2017-01-24 21:27:34
【问题描述】:

当我尝试使用 PHP odbc_connect() 通过 ODBC 数据源连接到 Oracle 时,我无法获得 UTF-8 支持。

所有这些都是在 32 位下完成的。我正在使用 oracle XE DB 进行测试和 instaclient11_2 32 位驱动程序,ODBC 数据源 32it +放置在 WAMP32 位服务器上。

尽管我使用 Oracle 12c DB 和客户端 Home 10g 32 位驱动程序的结果相同。

@TODAY 使用 64 位 instanclient 驱动程序测试了这一切,在 64 位 WAMP 服务器上添加了 ODBC 64DataSource。仍然没有正确显示字符的运气......

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>

<?php
$connect = odbc_connect("XEXDB", "username", "password");

$query = "SELECT col, 'čaļi' FROM TESST";

$result = odbc_exec($connect, $query);

while(odbc_fetch_row($result)){
  $name = odbc_result($result, 1);
  $surname = odbc_result($result, 2);
  echo "$name, $surname <br/>";
}

odbc_close($connect);

?>

我从这段代码得到的结果:

?A?IS, A?aA?i 
Gunt?rs Salts, A?aA?i 

但应该是:

ĶAĶIS, čaļi
Guntārs Šalts, čaļi

我找不到如何为odbc_connect() 编写$dsn 来强制charset=utf-8,到目前为止还没有运气使用charset=utf-8 工作$conn_string。

还尝试使用utf8_encode()utf8_decode()(使用这个让我绝望了)。

有没有人遇到过类似的问题,或者有人有什么建议我可以试试?

【问题讨论】:

  • 像您的 Oracle 这样的锁返回正确的 UTF-8(因为它显示 2 个字符而不是 1 个)- 专注于显示问题。尝试echo "čaļi"; 很可能它也不起作用,在这种情况下,问题与 Oracle 无关。
  • @WernfriedDomscheit 我已经尝试过了,它会正确显示其他内容,你可以建议,因为我没有选择。没有提到我测试的所有内容,但我做了很多。

标签: php oracle utf-8 odbc


【解决方案1】:

我发现,ODBC 甚至 ADO 连接到 ORACLE DB 的返回具有相同的返回 ???而不是 UNICODE 字符。

要解决此问题,我必须在 WINDOWS REGISTRY 中的 32 位 64 位位置下为 ORACLE 键添加 NLS_LANG 字符串值和您的 DB 字符集。

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE             --64 bits
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE --32 bits

在我的情况下,对于 STRING VALUE(REG_SZ) 和 VALUE:

"NLS_LANG"="LATVIAN_LATVIA.BLT8MSWIN1257" 

如果有人仍然没有得到完整的图片,我添加了 reg 文件的转储:

[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE]
@=""
"NLS_LANG"="LATVIAN_LATVIA.BLT8MSWIN1257"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多