同様の質問がありましたが、通常の解決策は私にはうまくいきません。おそらく私は何かが欠けています。私は私の心を失いかけています:(((
タイトルからわかるように、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);
何も変わっていません...