我正在为一家购买 DBA Manufacturing 的公司工作,我需要从 Pervasive SQL 2000i DB 中检索一些值。不幸的是,没有升级数据库的计划,所以我必须尽我所能。我正在运行 32 位
我能够odbc_connect
在 Windows 机器上用 PHP 调用 DSN。我正在使用 NGINX 在 Windows 上运行 PHP。
<html>
<head>
<title>
Placeholder Title
</title>
</head>
<body>
<?php
// mb_internal_encoding("UTF-8");
// connect to the dbamfg DSN
$connect=odbc_connect("Driver={Pervasive ODBC Client Interface};ServerName=dbamfg.1583;ServerDSN=dbadefault;","","");
// query the users table for name and surname
$query = "select * from BKARINVL where BKAR_INVL_INVNM = 600100 order by bkar_invl_cntr ";
//Prepare the statement
$result = odbc_prepare ($connect, $query);
// execute the query
odbc_execute($result);
// fetch the data from the database
while(odbc_fetch_row($result)){
$SalesOrder = odbc_result($result, 1);
$InvLine = odbc_result($result, 2);
$EstShpDt = odbc_result($result, 3);
$ProdCode = odbc_result($result, 4);
$ProdDesc = odbc_result($result, 5);
echo ('<br />'.$InvLine.'<br />');
echo ($SalesOrder.'<br />');
echo ($EstShpDt.'<br />');
echo ($ProdCode.'<br />');
echo ($ProdDesc.'<br />');
}
// closing the connection
odbc_close($connect);
?>
</body>
</html>
查询返回数值就好了。当涉及到文本列时,它会返回 10 个字符,然后显示未正确显示的字符。
这是一个例子:
1
600100
2015-05-31
020-0015-1
DIGITAL VI!2S��
2
600100
2015-05-31
020-0012-0
2 X 4 AUDI!5S��
3
600100
2015-05-31
020-0065-0
16-CKT LOW!8S��
我很兴奋也很震惊,我已经走到了这一步!通过 ODBC 连接从 Pervasive 检索值非常快,我觉得我非常接近成功。我只需要朝着正确的方向前进。
到目前为止我尝试过的所有内容:我尝试将页面的内部编码设置为几个不同的字符集,包括 UTF-8、Windows、ASCII 等。我还尝试在 DSN 期间选中 ODBC 驱动程序设置选项下的复选框在 Windows 中设置,显示“使用 OEM/ANSI 转换”。这只会稍微改变字符。
另一个线索是,由于某种原因,当我System.Data.odbc
在 C# 中调用连接字符串时,它会完整返回查询和文本值。
我曾尝试使用iconv
将值转换为 UTF-8 等,但无济于事。我尝试强制标题以不同的字符集显示页面。我已经尝试过mb_detect_encoding()
,odbc_result()
返回值显示为 UTF-8,但我认为它必须这样做必须有人知道如何解决这个问题。请,有人会指出我正确的方向吗?我将永远感激不尽!
如果需要添加更多内容来解决此问题,我会在需要时将其包含在内。谢谢!