MySQL ドキュメント : 5.2 Connector/ODBC Connection Parameters に charset パラメータがあります。 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 + データベースの最新記事】
- PDO MySQL のバインドを使用した標準的な記述( ロリポップ )
- PHP で MySQLをテストする為のソースコード
- PHP で ODBC 関数を使って MS Access( データベース )にアクセスして結果を JSON 文字列として出力する
- PHP : SQLインジェクション対策付きの、MySQL のデータを JSON で返す自家製 API テスト用のテンプレート3パターン
- PHP で 自家製 API を作成して jQuery の簡単なコードで更新処理を行うサンプル
- PHP : PIPES_AS_CONCAT を使用して、CSV 作成処理をサーバの負荷にして高速に WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP : WrodPress のデータを insert SQL で保存する処理
- PHP : WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP で MySQLi 使用時の データ型定数( MYSQLI_TYPE_ ) の詳細 ( バックアップ用 insert 文を作る為 )
- PHP から MySQL の簡易的なバックアップを取得する( 但し、DBサーバがディスクへの書き込み権限を持っている必要があります )
- PHP : JSON 文字列で定義されたフォーマットを元に、そのフォーマットにセットされた配列を使って insert と update の SQL 文を自動作成。
- PHP : PDO のエラー処理
- PHPのマニュアルにある、SQLインジェクション攻撃の例
- PHP : SQLite3 を PDO の ODBC 経由で読み込み
- PHP : 5.3 / 5.2.11 用共用 sqlite3(日本語テーブル) 読み込み
- PHP : Oracle を処理する COM を使ったクラス