ちょっと物知り博士のちょこっと講座 戻る

第19回 PostgreSQLより熱い?こんどはMySQLなのだ!!

「PHP]の稿で書きましたが筆者は浮気性なのだ。本当は「ダボハゼ」であるのかもしれない。
PHPのサンプルプログラムをいろいろのサイトからダウンロードして動作を確認しようとしているうちにデータベースを使用しているプログラムに遭遇した。そのプログラムで使用しているデータベースは「MySQL」なのだ。
筆者のLinuxサーバーにはMySQLの環境はインストールしていないのでデータベースの関数の個所をPostgresに変更して動作させてみたが、MySQLとPostgresのデータベース関数が違うところがあり、うまく動作しない。
しからばMySQLをインストールしちゃえ。
少々恥ずかしい話ではあるが、先のサンプルプログラムを見るまでは、GNU のデータベースとしてMySQLがあるのは知らなかったのです。名前だけは、PostgreSQLを調べるときについでに見かけた事があったけど、そのときにMySQLは○○という会社がライセンスをもっているとかなんとか書いてあったようなので、全く気にも留めていなかった。
日本MySQLユーザー会のサイトからの引用
MySQL は高速性と堅牢性を追及したマルチユーザ・マルチスレッドのSQLデータベースです。
開発元のTcX では、10,000以上のテーブルを含む40以上のデータベースが動いており、このうち500以上のテーブルは7,000,000以上のレコードを持ち、全体で約100GBのミッションクリティカルなデータで構成されています。
基本的に無償で利用できます。
すごいではないか。ここにもLicence Free のデータベースが存在したのだ。
でも、名前が軽いな。 my が個人専用とか表しており、何の事か解らんPostgreSQLのほうがなんだか重厚そうだな。
NobleSQLなんて名前がいいなー(こらー勝手に名前をつけるんじゃーないぞ)
能書きはこれくらいにして早速使ってみませう。
早速パッケージをダウンロードしました。
http://www.mysql.com/downloads/mysql-3.23.html

このサイトから
MySQL-3.23.42-1.i386.rpm
MySQL-shared-3.23.42-1.i386.rpm
MySQL-bench-3.23.42-1.i386.rpm
MySQL-client-3.23.42-1.i386.rpm
MySQL-devel-3.23.42-1.i386.rpm
を取得しました。

インストール手順

@ ユーザーアカウント
mysql −−− passwd;isiadmin−−− home;/home/mysql
A rpmでインストールした
# cd /home/mysql
# rpm -i MySQL-3.23.42-1.i386.rpm
これで全てのMYSQL がINSTALL される

DEMON; /etc/rc.d/init.d/mysql
B 理由はないが、なんとなく違う雰囲気であったので強制削除した
# rm -r --force mysql
C 別のアーカイブを取得
mysql-3.23.42.tr.gz
D ユーザーmysql でログイン
# su - mysql
E アーカイブの展開
/home/mysqlへ置いて
$ tar zxvf mysql-3.23.42.tr.gz

/home/mysql/mysql-3.23.42 が作られた
F Makefile を作成する
$ cd mysql-3.23.42
$ ./configure --with-charset=ujis --prefix=/home/mysql --with-low-memory

Makefile が作られているか確認しよう
G プログラムコンパイル
$ make
少々時間がかかって完了。ほんまに長い、タバコ2本吸った。 Take a Coffee time!
$ su - root
$ make install
完了しました
H データベースの初期化
# /home/mysql/bin/mysql_install_db
# chown -R mysql /usr/local/mysql
# chgrp -R mysql /usr/local/mysql
I MySQLの起動
# su mysql
% /home/mysql/bin/safe_mysqld &
(/home/mysql/bin/safe_mysqld --log &)

/usr/local/binへ シェルスクリプト登録 mysqlst
J MySQLの停止
# su mysql
% cd /home/mysql/bin
% ./mysqladmin -u root -p shutdown

/usr/local/bin へシェルスクリプト登録 mysqlstp
J sql 処理の起動
# su mysql
% cd /home/mysql/bin
% ./mysql -u root -p

/usr/local/bin へシェルスクリプト登録 mysqlgo
これでインストール完了
かと思ったら
apacheを起動したら libmysqlclient.so.10が動作しない
libmysqlclient* をfind してみるとこのモジュールが存在しない。
もしかしてMySQLを使うという宣言をPHP にしてやらんけりゃならんみたい
結局PHP の再インストールを行なった。
前に作成した phpconf という名前のスクリプトにmysql の宣言を追加した
./configure --with-apxs=/usr/local/apache/bin/apxs \
--x-include=/usr/X11R6/include \
--x-libraries=/usr/X11R6/lib \
--with-jpeg-dir=/usr/local/lib \
--with-tiff-dir=/usr/local/lib \
--with-gd-dir=/usr/lib \
--with-xpm-dir=/usr/local/lib \
--with-pdflib-dir=/usr/bin \
--with-pgsql=/usr/local/pgsql \
--with-pgsql=/usr/home/mysql \ // 追加
--with-zlib-dir=/usr/include \
--with-png-dir=/usr/lib \
--enable-ftp \
--enable-versioning
configureを実行します。
$ sh phpconf
Makefile が作られているのを確認してください
上記のスクリプトで --with-apxs と指定しているのは apacheのDSOを用いてインストールするので、 apacheのインストール先と、apxs(モジュールをDSOとして構築するためのツール)の位置を指定しています。
$ make$ su
$ make install
これにより/usr/local/apache/libexecにlibphp4.soというライブラリが生成さ れているはずです。
正常に終了したが相変わらず libmysqlclient.so.10 が見つからないエラー発生
そのままapache を立ち上げると
libphp4.so のinclude において libmysqlclient.so が無いとエラーがでます ????????
LD_LIBRARY_PATH にlibmysqlclient.soが入っているフォルダのPATHを指定するか
/home/mysql/lib/mysql/libmysqlclient* を /usr/lib/へコピーします。
これでapacheを再起動したら 良好良好。 動きました。
PHPから MySQL をアクセスするプログラムを作りました。ほんの初歩ですから笑わんように。
これはPostgreSQLのテーブルを読んでMySQLのテーブルへデータを移すプログラムです

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>Guest Book: DB version</title>
</head>
<?
$database = pg_Connect ("dbname=guestbook user=postgres password=postgres"); //Postgreとの接続を行なう。
$result = pg_exec ($database, "select * from parklist");
pg_close($database);
?>

<html>
<body>
<div align="center">
<table border = "1"> <!-- 検索結果を表組みして出力する。-->
<caption>検索結果</caption>
<?
$row = pg_numrows($result); //検索結果の行数を取得する。
$arr = pg_fetch_row($result, 0);

echo "<tr>";

for($i = 0; $i < count($arr); $i++) //列の数だけループしてフィールド名を出力する。
echo "<td>" . pg_fieldname($result, $i) . "</td>";

echo "</tr>";

$accom = mysql_connect("localhost","root","isiadmin");
$accom = mysql_select_db("guestbook");

for($i = 0; $i < $row; $i++){ //行の数だけループしてフィールド名を出力する。

$data = pg_fetch_array ($result, $i, PGSQL_ASSOC);
foreach($data as $key => $value){
$$key = $value;
}
echo "<tr>";
echo "<td>$parkid</td>";
echo "<td>$name</td>";
echo "<td>$email</td>";
echo "<td>$parkname</td>";

$accom = mysql_query("insert into parklist set parkid='$parkid', name='$name', email='$email', parkname='$parkname'");

}
echo "</tr>";
mysql_close();
?>
</table>
</div>
</body>
</html>
これはMySQLのテーブルを読んでPostgreSQLのテーブルへデータを移すプログラムです
for($i = 0; $i < count($arr); $i++) //列の数だけループしてフィールド名を出力する。
echo "<td>" . mysql_field_name($result, $i) . "</td>";

echo "</tr>";

//行の数だけループしてフィールド名を出力する。
while ($data = mysql_fetch_assoc($result)){
foreach($data as $key => $value){
$$key = $value;
}
echo "<tr>";
echo "<td>$parkid</td>";
echo "<td>$name</td>";
echo "<td>$email</td>";
echo "<td>$parkname</td>";

$accom = pg_exec("insert into parklista values('$parkid','$name','$email','$parkname')");

}
echo "</tr>";
pg_close($database);
?>
</table>
</div>
</body>
</html>
PostgreSQLとの比較について・・・
MySQK とPostgreSQLとどちらが優れているか・・Oh! It's nonsence。

いろんなサイトを見る限りでは日本ではMySQLはPostgreSQLほど知られていないようだ。筆者の乏しい経験(ほとんど無い)から言えば、双方ともこれといった優劣を論ずるべき点は無いように思える。

あとは好みの問題かなー。 よかったら両方使ったら?
PHP でのデータベース関数の比較表
MySQL 関数 PostgreSQL関数
mysql_affected_rows 一番最近のクエリーで変更された行の数を得る pg_cmdtuples 影響を受けたタプルの数を返す
mysql_change_user アクティブな接続でログイン中のユーザーを変更する
mysql_close MySQL接続を閉じる pg_close PostgreSQLコネクションを閉じる
mysql_connect MySQLサーバーへの接続をオープンする pg_connect PostgreSQLコネクションを開く
mysql_pconnect MySQLサーバーへの持続的な接続をオープンする pg_pconnect 持続的なデータベース接続を行う
mysql_create_db MySQLデータベースを作成する
mysql_data_seek 内部的な結果ポインタを移動する
mysql_db_name データベース名を得る pg_dbname データベース名の取得
mysql_drop_db MySQLデータベースを破棄(削除)する
mysql_errno 直近のMySQL処理からエラーメッセージのエラー番号を返す
mysql_error 直近に実行されたMySQLコールのエラーメッセージを返す pg_errormessage エラーメッセージの取得
mysql_escape_string mysql_queryで使用するために文字列をエスケープする
mysql_fetch_array 連想配列、添字配列、またはその両方として結果の行を取得する pg_fetch_array 行を配列として取得する
mysql_fetch_assoc 連想配列として結果の行を取得する
mysql_fetch_field 結果からカラム情報を取得し、オブジェクトとして返す pg_fieldnum カラム番号を返す
mysql_fetch_lengths 結果における各出力の長さを得る
mysql_fetch_object 結果の行をオブジェクトとして取得する pg_fetch_object 行をオブジェクトとして得る
mysql_fetch_row 結果を添字配列として取得する pg_fetch_row 数字をインデックスとする配列として行を得る
mysql_field_flags 結果において指定したフィールドのフラグを得る
mysql_field_name 結果において指定したフィールド名を得る
mysql_field_len 指定したフィールドの長さを得る pg_fieldprtlen 表示される長さを返す
mysql_field_seek 結果ポインタを指定したフィールドオフセットにセットする
mysql_field_table 指定したフィールドが含まれるテーブルの名前を得る
mysql_field_type 結果において指定したフィールドの型を得る pg_fieldtype フィールド番号に対応する型名を返す
pg_FieldIsNull フィールドがNULLかどうか調べる
pg_fieldsize 指定したフィールドの内部記憶領域におけるサイズを返す
mysql_free_result 結果保持用メモリを開放する pg_freeresult メモリを開放する
mysql_insert_id 直近のINSERTで生成されたIDを得る pg_getlastoid 直近のオブジェクトIDを返す
mysql_list_dbs MySQLサーバー上で利用可能なデータベースのリストを得る
mysql_list_fields MySQL結果フィールドのリストを得る
mysql_list_tables MySQL データベース上のテーブルのリストを得る
mysql_num_fields 結果におけるフィールドの数を得る pg_numfields フィールド数を返す
mysql_num_rows 結果における行の数を得る pg_numrows 行数を返す
mysql_db_query MySQLクエリーを送信する
mysql_query SQLクエリーをMySQLに送信する pg_exec クエリーを実行する
mysql_result 結果データを得る pg_result 結果IDから実際の値を返す
mysql_select_db MySQL データベースを選択する
mysql_tablename フィールドのテーブル名を得る pg_fieldname フィールドの名前を返す
mysql_get_client_info MySQLクライアント情報を得る
mysql_get_host_info MySQLホスト情報を得る pg_host ホスト名を返す
mysql_get_proto_info MySQLプロトコル情報を得る
mysql_get_server_info MySQLサーバ情報を得る
pg_end_copy PostgreSQLバックエンドに同期する
pg_loclose ラージオブジェクトをクローズする
pg_locreate ラージオブジェクトを生成する
pg_loexport ラージオブジェクトをファイルにエクスポートする
pg_loimport ファイルからラージオブジェクトをインポートする
pg_loopen ラージオブジェクトをオープンする
pg_loread ラージオブジェクトを読み込み
pg_loreadall ラージオブジェクト全体を読み込む
pg_lounlink ラージオブジェクトを削除する
pg_lowrite ラージオブジェクトを書く
pg_options オプションを返す
pg_port ポート番号を返す
pg_put_line NULLで終る文字列をPostgreSQLバックエンドに送信する
pg_set_client_encoding PostgreSQLクライアントのエンコーディングを設定する
pg_client_encoding PostgreSQLクライアントのエンコーディングを取得する
pg_trace PostgreSQLサーバーへの接続をトレースする
pg_tty tty名を返す
pg_untrace PostgreSQLサーバーへの接続のトレースを無効にする