SQLの窓

2018年02月06日


Windows 環境の MySQL + PHP で、ODBC ドライバを使用してデータを取得する場合の3パターン

MySQL ドキュメント : 5.2 Connector/ODBC Connection Parameterscharset パラメータがあります。

SHOW VARIABLES で確認できる 'character_set' 関連が utf8 という環境(character_set_results は空)が前提ですが、charset=cp932 にしてPHP のコードを SHIFT_JIS にすると何も問題無く処理できます。

PHP:shift_jis ODBC:cp932
<?php
header( "Content-Type: text/plain; charset=shift_jis" );

$host = "localhost";$db = "lightbox";$user = "root";$pass="pass";
$connect_string = "Driver={MySQL ODBC 5.3 Unicode Driver};server={$host};database={$db};charset=cp932";
$odbc = odbc_connect($connect_string, $user, $pass);

$query = "select * from 社員マスタ";

if ($result = odbc_exec( $odbc, $query) ) {

	while( $row = odbc_fetch_array( $result ) ) {
		$rows[] = $row;
	}
	odbc_free_result($result);
}

odbc_close( $odbc );

print_r($rows);

?>


しかし、今では一般的な UTF-8(UTF8N) で PHP のコードを使用して、charset を utf8 にしても、戻される行のデータのみが正しく UTF-8 で取得できるだけで、渡す SQL が SHIFT_JIS である必要があるのと、戻る列名も SHIFT_JIS なので2箇所を変換する必要があります。

詳細は良く解りませんが、古い32ビットのソフトウェアで charset を cp932 にして正常に動作している環境でデータをエクスポートすると 列データと insert されたデータのキャラクタセットが違うという結果になります。この事から、日本語用の ODBC ドライバは SHIFT_JIS に特化した処理を行っているのかもしれません。

そもそも MySQL を Windows で使用するにしても、ODBC では無く mysqli を使用すれば PHP サイドからすると事は単純になります。

PHP:utf-8 ODBC:utf8
<?php
header( "Content-Type: text/plain; charset=utf-8" );

$host = "localhost";$db = "lightbox";$user = "root";$pass="pass";
$connect_string = "Driver={MySQL ODBC 5.3 Unicode Driver};server={$host};database={$db};charset=utf8";
$odbc = odbc_connect($connect_string, $user, $pass);

$query = "select * from 社員マスタ";
// SQL は SHIFT_JIS で渡す
$query = mb_convert_encoding($query,"MS932","utf-8");

if ($result = odbc_exec( $odbc, $query) ) {

	while( $row = odbc_fetch_array( $result ) ) {

		$new_row = array();
		foreach( $row as $k => $v ) {
			// 列名が SHIFT_JIS なので変換して使う
			$new_row[mb_convert_encoding($k,"utf-8","MS932")] = $v;
		}
		$row = $new_row;

		$rows[] = $row;

	}
	odbc_free_result($result);
}

odbc_close( $odbc );

print_r($rows);

?>


最後のパターン

charset を cp932 にして PHP を UTF-8 で作成する方法です。UTF-8 の環境の中に無理やり shift_jis の環境をねじ込むようなやり方になっていますが(列もデータも変換する)、Microsoft Access を対象とした ODBC 経由の処理と同じになり、これはこれでいろいろ有効な方法です。

PHP:utf-8 ODBC:cp932
<?php
header( "Content-Type: text/plain; charset=utf-8" );

$host = "localhost";$db = "lightbox";$user = "root";$pass="pass";
$connect_string = "Driver={MySQL ODBC 5.3 Unicode Driver};server={$host};database={$db};charset=cp932";
$odbc = odbc_connect($connect_string, $user, $pass);

$query = "select * from 社員マスタ";
$query = mb_convert_encoding($query,"MS932","utf-8");

if ($result = odbc_exec( $odbc, $query) ) {

	while( $row = odbc_fetch_array( $result ) ) {

		$new_row = array();
		foreach( $row as $k => $v ) {
			$new_row[mb_convert_encoding($k,"utf-8","MS932")] = mb_convert_encoding($v,"utf-8","MS932");
		}
		$row = $new_row;

		$rows[] = $row;

	}
	odbc_free_result($result);
}

odbc_close( $odbc );

print_r($rows);

?>





【PHP + データベースの最新記事】
posted by lightbox at 2018-02-06 23:26 | PHP + データベース | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり