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」であることがわかります。

最後に、default_charset = "ISO-8859-9"/ etc / php5 / apache2 / php.iniファイルのような行があり、出力phpinfo()のコアセクションに、default_charsetがISO-8859-9であることがわかります。

これらすべての作業の後、文字を含む文字列を取得してİエコーすると、「?」と表示されます。それは問題!!!クエリを実行するselect dump(nameofthatstring, 16)...と、そのバイト値がDDであることがわかります。つまり、8859-9に従って正しいことがわかります。

関連性があるかどうかはわかりませんが、最終的な詳細を説明します。ıフォームに文字を入力し、GETでajaxを介して送信すると、%FD、つまり8859-9の対応する値に変換されます。問題ありません。 。

urldecodeしてエコーすると、再び問題ありませんııしかし、 (ajaxリクエストを受け取った後)where句に文字列を含むクエリがあると、空のセットが返されます。

ただし、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環境変数
NLS_LANGFRENCH_FRANCE.WE8ISO8859P1を作成する
*これらの行をhttpd.confSetEnvNLS_LANGFRENCH_FRANCE.WE8ISO8859P1に追加することで
修正しました。

注意:FRENCH_FRANCE.WE8ISO8859P1を適切な値に置き換えてください

于 2013-12-10T11:04:01.917 に答える