当从Netezza数据库读取数据时,PHP会将特殊字符替换为带有问号,仅在Linux

时间:2018-06-05 09:32:12

标签: php encoding odbc netezza

我使用ODBC从使用PHP的Netezza数据库中读取数据。

系统:Red Hat Linux 7,Netezza ODBC驱动程序,unixODBC,已安装多个软件包的httpd。

数据库:IBM Netezza,数据存储为latin9(给出数据库配置,不能更改)。数据:

NAME
----
Frank
Fränk

当我用PHP从数据库中读取数据时,特殊字符被替换为问号(不是这些?在钻石中,这没关系)。 PHP代码:

$nz = odbc_connect('DRIVER={NetezzaSQL};SERVER=x.x.x.x;PORT=5480;DATABASE=database;','username','password');
$result = odbc_exec($nz, 'select * from CUSTOMERS');
while(odbc_fetch_row($result)) {
    echo odbc_result($result, 'NAME').'<br>'.PHP_EOL;
}

结果:

Frank
Fr?nk

到目前为止我尝试了什么:

  • 当我使用str_replace('?','X',...)时,我甚至会得到FrXnk。这意味着ä成为一个真正的问号,字符串的进一步转换/编码(例如utf8_encode())无济于事。
  • DBS字符串中的选项:Client_CSet = latin9,Client_CSet = utf8,Server_CSet = latin9,Server_CSet = utf8,charset = latin9,charset = utf8等等没有帮助。
  • PDO而不是odbc_connect()产生相同的结果:Fr?nk
  • 在使用XAMPP的Windows系统上,相同的代码可以正常工作。 odbc_result()返回一个latin9编码的字符串,utf8_encode()返回Fränk。
  • 我也可以使用相同的ODBC连接在Linux系统上使用R. R正确读取Fränk。

对我来说很清楚,ODBC驱动程序正在运行并返回一个latin9编码的字符串。 Linux系统上的PHP正在进行一些内部转换,用问号替换字符。任何想法我能做什么?

PS:这不是“UTF-8一直到”的复制品。首先,我无法更改数据库编码。其次,在连接字符串中指定charset没有帮助。第三,它是一个Netezza数据库,而不是MYSQL,我不能使用任何那些MYSQL函数,Netezza在设置方面有点奇怪。但是,我找到了从数据库中正确检索数据的方法,只是Linux上的PHP不起作用。

0 个答案:

没有答案