3

有人问过类似的问题,但常规的解决方案对我不起作用。可能我错过了一些东西。我快要失去理智了:(((

从标题可以理解,我有一个非ascii内容的oracle数据库。我想使用oci8用php查询/显示它。

首先,数据库在ISO8859P9,即查询

select parameter, value from v$nls_parameters where parameter in ('NLS_CHARACTERSET', 'NLS_LANGUAGE', 'NLS_TERRITORY')

返回

NLS_LANGUAGE        AMERICAN
NLS_TERRITORY       AMERICA
NLS_CHARACTERSER    WE8ISO8859P9

所以我相应地设置了NLS_LANG 变量,即getenv("NLS_LANG") 返回"AMERICAN_AMERICA.WE8ISO8859P9"。

我插入AddDefaultCharset ISO-8859-9到 /etc/apache2/conf.d/charset 文件中,并且总是包含<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">在 php 文件的 html 内容的 head 部分中。因此,当我通过 firebug 检查时,我看到响应的“Content-Type”标头是“text/html; charset=ISO-8859-9”。

最后,我在 /etc/php5/apache2/php.ini 文件中有一行,default_charset = "ISO-8859-9"在输出 phpinfo() 的核心部分,我看到 default_charset 是 ISO-8859-9。

毕竟这些东西,当我检索一个带有字符的字符串İ并回显它时,它显示为'?'。那就是问题所在!!!当我查询时select dump(nameofthatstring, 16)...,我看到它的字节值是 DD,即根据 8859-9 是正确的。

我不确定它是否相关,但我会给出最后的细节:当我ı在表单中输入一个字符并在GET中通过ajax提交时,它被转换为%FD,即8859-9对应的值,没有问题.

当我对它进行 urldecode 并回显它时,它又可以了,我明白了ı。但是当我有一个包含ı在其 where 子句中的字符串的查询时(在接收到 ajax 请求之后),它返回空集。

但是,如果我使用 CHR(253) 选择行,则会正确选择行,但再次打印这些行会导致“?” 人物。

我真的被困住了。任何帮助将不胜感激。提前致谢。

编辑:

$database = "(DESCRIPTION= (ADDRESS= (PROTOCOL=TCP)(HOST=XXXX)(PORT=1521)) (CONNECT_DATA= (SERVER=dedicated)(SERVICE_NAME=sname)))";

首先,我试过这个:

oci_pconnect($username, $password, $database, "AMERICAN_AMERICA.WE8ISO8859P9");

但是没有解决,所以我设置了 NLS_LANG 变量,改成如下:

oci_pconnect($username, $password, $database);

没有改变...

4

2 回答 2

4

尝试像这样连接:

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
$db = "(DESCRIPTION=
     (ADDRESS_LIST=
       (ADDRESS=(PROTOCOL=TCP)
         (HOST=$dbhost)(PORT=$dbport)
       )
     )
       (CONNECT_DATA=(SID=$dbname))
 )";
 $conn = OCILogon($dbuser, $dbpasswd, $db);

$db*根据您的配置设置变量。

于 2012-11-02T13:04:25.667 回答
1

我假设你在windows环境中。

我有同样的问题,我通过
* 创建一个 Windows 环境变量
NLS_LANG FRENCH_FRANCE.WE8ISO8859P1
* 将这些行添加到我的 httpd.conf
SetEnv NLS_LANG FRENCH_FRANCE.WE8ISO8859P1来修复它

注意:用适当的值替换 FRENCH_FRANCE.WE8ISO8859P1

于 2013-12-10T11:04:01.917 回答