そういうのがいいブログ

SIerで働く30代サラリーマンSEがインフラエンジニアに憧れてLinux・クラウド・AWSの勉強をするブログ

PHPでOracle接続してブラウザで文字化け・文字コードはSJISかUTF-8

PHPでOracle接続してブラウザで文字化け

LinuxサーバでPHPからOracleデータベースに接続するときの文字化けの解消方法を探している方へ

PHPからOracleデータベースに接続するとブラウザ上で文字化けしてしまう

PHPからOracleデータベースに接続して取得した内容をブラウザ上に表示したいが、
文字化けしてしまう
ので解消方法をを知りたい、と考えていませんか?

PHPからOracleデータベースに接続するときの文字化けの対処方法を紹介します

本記事では、下記の内容を解説します。

  1. PHPからOracleに接続するときの文字化けの解消の方法
  2. ラクルデータベースのおススメの勉強法の紹介

この記事を書いている私は、某SIerに勤務しながら、
WEB系エンジニア・インフラエンジニアに憧れて、プログラミングおよびインフラ技術の勉強をしています。
私が実機で試したコマンドや画像を載せて書いています。
記事の信頼性担保に繋がると思います。

前提(今回の環境)

項目 データベースサーバ WEB-APサーバ(PHP-Apache)
OS Oracle Linux 7.8 CentOS 8.1
サーバ名 SV-PLUTO SV-NEPTUNE
DB Oracle 19c -
PHP - PHP 7.2
WEB - Apache 2.4
文字コード NLS_LANG=
Japanese_Japan.JA16SJISTILDE
Apacheの実行ユーザーの.bash_profile
環境変数
NLS_LANG=
Japanese_Japan.AL32UTF8

DBサーバと、WEB/APサーバの2台構成にしているシステムを想定しています。

WEB/APサーバには、以下の記事の手順で「OCI8」をインストールしてあります。

souiunogaii.hatenablog.com

oci_connectのDSNの書き方

https://www.php.net/manual/ja/function.oci-connect.php

character_set
Oracle クライアントライブラリが使う文字セットを指定します。 これは、データベースが用いる文字セットと一致させる必要はありません。 一致していない場合は、Oracle が最善を尽くしてデータベースの文字セットとの間の変換を行います。 文字セットによっては、この変換結果がうまく使えないこともあります。 また、変換にはそれなりの時間を要します。

省略した場合は、 Oracle クライアントライブラリは環境変数 NLS_LANG の値をもとに文字セットを判断します。

このパラメータを渡すことで、 接続に要する時間を短縮できます。 PHPマニュアル>関数リファレンス>データベース関連>ベンダー固有のモジュール>OCI8>OCI8関数>oci_connect

上記のPHPマニュアルによると、

データベースが用いる文字セットと一致させる必要はありません。
一致していない場合は、Oracle が最善を尽くしてデータベースの文字セットとの間の変換を行います。

だそうです。

character_setを指定しない場合

oci_connect($username,$password,$connection_string)
<?php

  $con = oci_connect($username,$password,$connection_string);

PHPでOracle接続してブラウザで文字化け

character_setを指定しないと、「????」と表示されてしまいました

character_setを「JA16SJISTILDE」にした場合

oci_connect($username,$password,$connection_string,'JA16SJISTILDE')
<?php

  $con = oci_connect($username,$password,$connection_string,'JA16SJISTILDE');

PHPでOracle接続してブラウザで文字化け

character_setを「JA16SJISTILDE」にしたら、完全に文字化けして表示されてしまいました

character_setを「AL32UTF8」にした場合

oci_connect($username,$password,$connection_string,'AL32UTF8')
<?php

  $con = oci_connect($username,$password,$connection_string,'AL32UTF8');

PHPでOracle接続してブラウザで文字化け

character_setを「AL32UTF8」にしたら、正しく表示することができました!

結果まとめ

character_set 表示結果
指定なし ????
JA16SJISTILDE 完全に文字化け
AL32UTF8 正しく表示

ラクルデータベースのおススメの勉強法の紹介

私は、某SIerに勤務しながら、入社以来10年以上、オラクルデータベースを使用したシステムに関わる仕事をしています。

ラクルデータベースについて、仕事場以外でも勉強をしたい、おススメの勉強法を知りたい、と考えている方のために、
①おすすめの書籍と、②おすすめのオンライン学習サイト、 を紹介します。

働きながら勉強するための、おススメの書籍とオンラインで学習できるサイトの紹介です

ラクルデータベースの勉強ができるおススメ書籍

朝の通勤時や帰宅時の電車の中や、社外打合せへの移動中などに勉強するなら、やはり書籍が一番だと思います。

Oracleの基本 ~データベース入門から設計/運用の初歩まで

技術エキスパートとして認定されたOracle ACEの渡部亮太さんの書かれた本です。

https://twitter.com/wrcsus4twitter.com

本書では、Oracle初心者/新人エンジニアが押さえておくべき知識とスキルを、現場で活躍するOracleエンジニアたちが、わかりやすく丁寧に解説。
Oracleの使い方はもちろん、データベースの基礎知識から、データ操作のためのSQL、テーブル設計、データベース運用/管理の基礎までしっかり押さえ、実務で使える入門スキルを身につけられます。
Oracleを学びたいすべての人に最適な入門書です。

Oracleの基本 ~データベース入門から設計/運用の初歩まで

プロとしてのOracleアーキテクチャ入門【第2版】

もう1冊、こちらもOracle ACEの渡部亮太さんの書かれた本です。

本書は、Oracle Databaseのアーキテクチャ(内部構成)について解説した入門書です。 本書の内容を理解することで「Oracleの動作の仕組み」を本質的に理解することができます。 これからOracleを使用する初心者の方から、実際にシステムの開発や運用管理を行っている DBエンジニアやシステムエンジニアの方を対象としています。

プロとしてのOracleアーキテクチャ入門【第2版】(12c、11g、10g 対応) 図解と実例解説で学ぶ、データベースの仕組み (Oracle現場主義)