ホームページ >バックエンド開発 >PHPの問題 >OracleへのPHP接続の文字化け問題を解決する方法

OracleへのPHP接続の文字化け問題を解決する方法

藏色散人
藏色散人オリジナル
2021-10-27 10:43:293228ブラウズ

Oracle への PHP 接続が文字化けする場合の解決策: 1. 環境変数を設定する; 2. Oracle の文字セットを取得する; 3. Pass "iconv('GBK','utf-8',$vo["USERNAME 「]);」メソッドを使用してエンコードを変換します。

OracleへのPHP接続の文字化け問題を解決する方法

この記事の動作環境: Windows 7 システム、PHP バージョン 7.1、DELL G3 コンピューター

php の解決方法接続オラクル文字化けの問題?

Oracle への PHP 接続と文字化けに関する注意事項

1. Oracle への PHP 接続

Step 1. Oracle Instant Client Core DLL の抽出

OTN の Instant Client ページから Windows 用の Instant Client Basic (11g) パッケージをダウンロードします。この圧縮ファイルのサイズは約 48MB です。サブディレクトリ (c:\instantclient11_2 など) を作成し、次のライブラリを圧縮ファイルから apache\bin ディレクトリにコピーします。

oraociei11.dll 
orannzsbb11.dll 
oci.dll

これら 3 つのファイルの合計サイズは約 126MB です。
古いバージョンの PHP で「oracle」拡張機能を使用するには (php.ini の「extension=php_oracle.dll」を使用して有効にします)、oci.dll の代わりに ociw32.dll をコピーします。

ステップ 2: 環境変数を編集し、c:\instantclient11_2 を PATH に追加します (システム環境変数は他の Oracle ディレクトリの前に配置されます)。

たとえば、Win7 では、[コンピューター] をクリックし、[プロパティ] を右クリックし、[システムの詳細設定] -> [詳細設定] -> [環境変数] をクリックしてシステム変数を編集します。リスト内のパス。
tnsnames.ora ファイルを使用して Oracle Net サービス名を定義する場合は、tnsnames.ora を c:\instantclient11_2 にコピーし、ユーザー環境変数 TNS_ADMIN を c:\instantclient11_2 に設定します。

ステップ 3: php の oci8 拡張機能を開きます。php.ini を編集して OCI8 拡張機能を開き、コメント記号 ';' を削除します: extension=php_oci8.dll

Apache を再起動します。サーバーを再起動します (サーバーを再起動する必要があります。再起動しないと環境変数が有効になりません)

再起動後、phpinfo() を通じて次の内容が表示されれば、構成は成功です:

oci8

# リビジョン アクティブな永続接続アクティブな接続#Oracle ランタイム クライアント ライブラリのバージョン##11.2.0.3.011.2有効有効##ディレクティブ
OCI8 サポート 有効
バージョン 1.4.7
##$Id: bf2eaf558b050b6d2e6d098bed6345af7e842ea4 $
0
0
Oracle Instant Client バージョン
一時 Lob サポート
コレクションのサポート
ローカル値マスター値値がありません値がありませんoci8.default_prefetch 100oci8.eventsオフオフoci8.max_persistent-1-1#oci8.persistent_timeout#-160Off20
oci8.connection_class
100
##oci8.old_oci_close_semantics Off Off
##-1 oci8.ping_interval
60 oci8.privileged_connect
Off oci8.statement_cache_size
20

 2. PHP Oracle 中文乱码问题

通常缺省配置连接Oracle在处理中文时都会遇到乱码问题,其实绝大部分人都知道在客户端连接Oracle服务端前首先要在客户端正确的设置服务端的字符集信息,通过PLSQL运行“select * from V$NLS_PARAMETERS;” 即可获取oracle的字符集,变量NLS_CHARACTERSET对应的就是我们需要的字符集,比如我这里就是“WE8ISO8859P1”

设置字符集的方法如下:

   方法一: 连接前设置环境变量            

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");
$conn=oci_new_connect($config['username'], $config['password'],$config['database']);

方法二:连接时设置环境变量

 $conn=oci_new_connect($config['username'], $config['password'],$config['database'],'we8iso8859p1');

    但是很快你会发现通过上述设置读取的中文数据在不设置编码的情况下可以正常显示,而一旦在页面(假如页面的字符集为UTF8)中使用则仍为乱码,

 并且即便做转换 从 we8iso8859p1 -> utf-8  依旧为乱码。

     其实仔细研究后发现oci8 以数据库编码WE8ISO8859P1获取数据后 自动转换为操作系统缺省的编码格式,假如我使用的操作系统缺省编码为GBK,则实际上通过OCI8读取后,字符的编码即为GBK, 因此在页面使用的时候编码转换应该为  从 GBK -> utf-8 :

 echo iconv('GBK','utf-8',$vo["USERNAME"]);

推荐学习:《PHP视频教程

以上がOracleへのPHP接続の文字化け問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。