有人问过类似的问题,但常规的解决方案对我不起作用。可能我错过了一些东西。我快要失去理智了:(((
从标题可以理解,我有一个非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);
没有改变...