[PHP-users 24791] データベースの文字コード変換処理

横山 修司 s-yokoyama @ jsb-g.co.jp
2005年 3月 5日 (土) 15:15:44 JST


はじめまして

横山と申します。

現在、検索プログラムを作製しているのですが、
データベースの文字コードの設定で詰まっております。
1:データベースの内部コード:Shift-JIS
2:PHPの内部コード:EUC-JP

3:PEARのDBライブラリを使用してSQL SERVERにアクセス、
4:PHP側で設定したSQLを実行して、データ取得
5:取得したデータをPHP側で処理

ここで、データベースから取得したデータが、
Shift-JISである為、PHPで処理を使用としたら、
一旦EUC-JPに変換してやる必要があります。

以上を踏まえて対策を考えたところ下記2通り考えられます
1:PHPの文字コードをShift-JISにして作り直す
 →文字列比較や文字化けを起こさないか心配です

2:データベースから受け取った文字列を
 foreach等でEUC-JPに変換する
 →DBライブラリを使用してステップ数を簡単にしているメリットが薄れる

データベースの文字コードは、現在運用中のデータがある為、
変換はしたくありません。
上記方法以外に良い方法はありますでしょうか。

すみませんよろしくお願いします。


■サーバー環境
データベース:Microsoft SQL SERVER 2003
→文字コードはSHift-JIS
OS          :Windows サーバー2003
PHP VERSION : 4.3.8 (稼動中プログラムの関係で4.3.10に出来ません)
→内部文字コードはEUC-JP

■プログラム抜粋
呼出部分
function _get_rent($id){
	$rent = 0;
	$rent_under = 0;
	$rent_over = 0;
	$under_key = '';
	$over_key = '';
	$rent_data = array();

	$sql =<<<EOF
SELECT item_A,item_B,item_C,item_D,
FROM table_doc
WHERE (id = "$id") AND (cd IN ("51","151","251"));
EOF;
	//ここで関数を呼び出しています
	$db_access = new db_access();
	$rent_data = $db_access->return_line($sql);

	//ここで処理
}

データベースアクセス関数
class db_access {
	var $dbUser = DB_USERNAME;
	var	$dbPass = DB_PASSWORD;
	var	$dbHost = DB_HOST;
	var	$dbName = DB_NAME;
	var $dbType = DBTYPE;
	var $db;

	//接続
	function _get_result($sql){
		$this->db = DB::connect("$this->dbType://$this->dbUser:$this->dbPass@$this->dbHost/$this->dbName");
	 	$this->db->setFetchMode(DB_FETCHMODE_ASSOC);
		$sql = mb_convert_encoding($sql , "sjis","euc");
	 	$result = $this->db->query($sql);
	 	return $result;
	}

	function return_line($sql){
		$rows = array();
		$result = $this->_get_result($sql);
		$cols = $result;
		$rows = $result->fetchRow(); //一行だけ取得
		$this->db->disconnect();
		mb_convert_variables("euc","sjis",$rows);//←ここでKey,Valueとも変換させようとする
		return $rows;
	}
}


PHP-users メーリングリストの案内