首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP OCI8无法从NCHAR读取Unicode字符(Oracle11g)

PHP OCI8无法从NCHAR读取Unicode字符(Oracle11g)
EN

Stack Overflow用户
提问于 2016-08-06 05:10:17
回答 2查看 661关注 0票数 1

在Linux服务器14.04上,我花了几天时间试图通过PHP7 OCI8 (用PDO_OCI和ODBC进行尝试,在PHP5中也使用相同的问题)从Oracle11g中读取Unicode字符(简体中文名)。

以下是Oracle 11g设置:

代码语言:javascript
复制
NLS_LANGUAGE    AMERICAN
NLS_TERRITORY   AMERICA
NLS_CHARACTERSET    WE8MSWIN1252
NLS_SORT    BINARY
NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE

重要的是,我试图读取的表列被定义为NCHAR(40)。我使用php-7.0.8 NTS,oci8-2.0.11 (来自PECL)并安装了Oracle实例化客户端

这是我使用的php代码:

代码语言:javascript
复制
<?php
$fp = fopen('output.txt','w');
$conn = oci_connect('MYUSER', 'MYPASSWORD', 'xxx.xxx.xxx.xxxx/DBTEST','AL32UTF8');

$query = "SELECT ABALPH FROM CRPDTA.F0101 WHERE ROWNUM <= 1 ORDER BY NULL";
$stid = oci_parse($conn, $query);
oci_execute($stid, OCI_NO_AUTO_COMMIT);

while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    fwrite($fp, $row['ABALPH']."\n");
}
fclose($fp);
?>

然后,我可以看到英文名称,但我会把它输入到我的txt文件(UTF8 w/o BOM格式)中。我认为这与NCHAR(40)数据类型有关。

请注意,我已经直接设置了Oracle env变量(通过导出和/或putenv())。当我使用sqlplus命令时,我可以将可读的中文名称导出到我设置的导出NLS_LANG =“简化CHINESE_CHINA.ZHS16GBK”的文件中。

知道怎么解决这个问题吗?我会非常感激的!你好,塞尔吉奥

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-08 05:26:27

我想我在这篇博客文章中找到了解决方案。

阅读本文的评论,NCHAR字段基本上需要转换为RAW/HEX:

代码语言:javascript
复制
$query = "SELECT UTL_RAW.cast_to_raw(convert(ABALPH,'AL32UTF8')) FROM CRPDTA.F0101 WHERE ROWNUM <= 1 ORDER BY NULL";

如果在PHP中使用oci8扩展,就没有必要进一步将十六进制转换为UTF8,因为根据文章,它是由PHP自动完成的。但是,如果您使用PDO_OCI,那么在使用hex2bin()作为UTF8字符串之前,您需要使用hex2bin()来转换十六进制字段。

希望这能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2016-08-08 11:08:18

PHP、OCI8或PDO_OCI中没有对NCHAR或NCLOB的本机支持。现在很多人都在使用UTF8,所以他们不需要N*支持。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38800770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档