ちょっと物知り博士のちょこっと講座 | 戻る |
第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サーバーへの接続のトレースを無効にする |