MySQL   MySQLとは?
  2006/01/03


MySQLとは?

 MySQLは無償で入手できる扱いやすい軽快なRDBMS(リレーショナルデータベース管理システム)です。 PostgreSQLと並ぶオープンソースRDBMSの代表格で、欧州で特に人気があります。 最大の特徴は検索の高速性に重点を絞った設計になっていることで、 商用RDBMSに比べ、処理を遅くする機構を大幅に省いた反面、 大量のデータを高速に検索することができます。 UNIX系各種OSやWindowsなど多くのプラットフォームに対応しているのも利点で、 WindowsPCでも手軽に使えるのは嬉しいところです。

 MySQLはフィンランドのMichael Wideniusさんによって1995年に開発され、 隣国スウェーデンを中心に欧米に幅広く普及しています。 現在その開発・サポートは専門の企業MySQL AB で行われており、 このサイトからソースアーカイブまたはコンパイル済みのバイナリ配布が無償でダウンロードできます。 MySQLはバージョン3.23.19からはGNU Public Licence(GPL)による配布となりました。 (現在は商用ライセンスも提供されています)

 なお日本国内では、 ソフトエージェンシーが MySQLのサポートを積極的に行っており、 ここで資料やプログラムなどの各種資源を入手できます。


MS-Windowsへのインストール

 Windows用にはよく整備されたインストーラつきのバイナリ配布があります。 アーカイブを展開した中に含まれる「SETUP.EXE」を起動するとインストーラが立ち上がるので、 その指示に従って作業すれば簡単にインストールできるはずです。 ここでは C:\Wintools\mysql にインストールしたとします。
 また、Windows環境の場合は、後述の「WinMySQLAdmin.exe」 がスタートメニューに登録され、OSの起動と同時にMySQLサービスが常駐します。


セットアップ

起動と確認
 最初にMySQLに正常にアクセスできるか確認してみます。
 まず、次のようにしてMySQLのサーバープロセスを起動します。

> mysqld --default-character-set=sjis
 そして、次のように mysqladminコマンドを使ってサーバーの起動チェックと状態確認を行えます。
> mysqladmin ping
mysqld is alive
> mysqladmin status
> mysqladmin extended-status
 停止するには次のようにします。
> mysqladmin -uroot shutdown

WinMySQLadmin(GUI管理ツール)の使用
 MS-Windows環境では、MySQLの各種設定やmysqldの起動・停止を行えるGUIツール 「WinMySQLAdmin」がとても便利です。 先述の通り起動時にスタートアップで開始しますが、終了してしまった場合に手動で再開するには、 コマンドラインで、

dos> C:\Wintools\mysql\bin\winmysqladmin
と打ちます。
 まだC:\Windows\my.iniがない状態(特に自分で作らなければ普通そうです) で最初に起動したときはデフォルトのmy.iniが作られます。 またこのとき、(Ver3.23まで)「WinMySQLAdminを使うためのMySQLユーザーを作ってチョ」 というダイアログがポップアップするので、 MySQLユーザー(後述します)をとりあえず作ります。 ここではユーザー名「mysuser」パスワードも適当に入力しておきます。
 そうそう、このWinMySQLadminでmy.iniを編集できるので、 [mysqld][mysql][mysqldump]の各セクションに
default-character-set=sjis
を追加しておくとよいです。 ただし、PHPからMySQLをコールするときはこのオプションをつけていると 「Can't Initialize Codeset 13...」 という不可解な(13というのがまた…)エラーメッセージが出るので外す必要があります。

rootパスワードの設定
 MySQLのデータベースにもOracle、Sybase、PostgreSQLなどと同じく ユーザーという概念があります。 rootと「 」(匿名ユーザー)の2つのユーザーは最初から作られています。 このうちrootはMySQLに対するあらゆる操作を行える管理ユーザーですが、 デフォルトではパスワードがついていません。 そこでまずrootにパスワードをつけるところから始めます。 シェルから次のようにmysqlコマンドを使い、パスワードをセットします。

CMD> mysql -u root mysql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('pass123');

(-u root は --user=root とすることも可能です)
または次のようにテーブルをSQL文で直接更新する方法でも行えます。

CMD> mysql -u root mysql
mysql> UPDATE USER SET PASSWORD=PASSWORD('pass123')
        WHERE USER = 'root';
mysql> FLUSH PRIVILEGES;

(こちらの場合は、FLUSH PRIVILEGES文の実行を忘れないで下さい) いったんrootにパスワードをつけてしまうと、もう
cmd> mysql -u root
ではエラーメッセージが出てMySQLを操作できなくなってしまいます。なぜ? 当然ですね。パスワードを入力しないといけないからです。 「--password=pass123」(または-p pass123)をつけてもいいのですが、 これではデスクの後ろで誰かがこっそり覗いていたらばればれですから、普通は
dos> mysql -u root -p
と-pオプションをつけます。この場合は「Password:」 というプロンプトが出るので、ここでパスワードを入力します。 後述しますが、root以外のMySQLユーザーの場合でも同様です。
 なお、rootユーザーはユーザーやデータベース、 権限に関するメタ情報を持つ表を管理している特別なユーザーです。 そのため、普通にデータ操作をするときは別のユーザーを作るとよいでしょう。 普通アプリケーション毎に1ユーザーとか、 実世界の1人を1ユーザーとかの方針で作ります。 ここでは、別ユーザーの作成は、「データベースの作成」の後で行います。

データベースの作成
 「データベース」という言葉はいろいろな意味で使われるので、 混乱を招きがちです。 「あれ?MySQLがデータベースだろ?もうインストールしただろ? 新しくデータベースを作るって、どうゆうこと?」 実は、Oracle、Sybase、MySQLなどのインストールする物 (EXE)は、正確にはRDBMS(リレーショナルデータベース管理システム)、 つまり、「データベースを管理するツールやアプリケーション」 という意味なんです。で、実際にデータを入れるものが「データベース」で、 これはOracle RDBMSから命令を実行することでOracleデータベースが作られ、 MySQL RDBMSから命令を実行することでMySQLデータベースが作られ… というイメージで捉えればよいでしょう。 OS的に見ると、1つのデータベースは1つ以上の決まった組のOSファイルで構成されます。
MySQLでは、 インストール直後に「mysql」「test」という2つのデータベースが作られていますが、 mysqlは先述のユーザーや権限に関する表が入る特別なデータベースですし、 testもまた別の意味で特別なデータベースです。 ですから、普通は必ず1つはデータベースを作ることになるでしょう。 MySQLでは、データベースは(マシン的なリソースが尽きるまで) たくさん作ることが出来ますが、 別々のデータベースに入ったデータは相互に参照することができなくなるので、 関連のあるデータは同じデータベース上に置く必要があります。 普通は、1つのアプリケーションに関するデータを1つのデータベースに配置するようにします。
 前置きが長くなってしまいましたが、MySQLでデータベースを作りましょう。 ここでは「udb」という名前のデータベースを作るものとします。 ユーザーrootでmysqladminを起動します。

CMD> mysqladmin -uroot -p create udb

または、rootでMySQLに接続して、

mysql> CREATE DATABASE udb;

でもOKです。
%MYSQL_HOME%\dataの下にデータベース名と同じ名前のディレクトリ (ここではudb)が作られているはずです。 このudbディレクトリの下に、ファイルが3つできますが、 これらがudbデータベースの正体です。 このデータベースに関するデータもまた、このディレクトリ内に格納されます。
 いらないデータベースを何個も作ってしまった場合に備え、 データベースを消す方法もここで紹介しておきましょう。
dos> mysqladmin -uroot -p drop udb
このコマンドは即座に問答無用で中のデータごとデータベースを消してしまうので、 操作には充分注意が必要です。

ユーザーの作成
 さて、データベースができたところでMySQLユーザーも作ります。 ユーザーを作るには、「ユーザーを作る」 という「権限」が必要ですが、最初にこの権限をもっているユーザーは rootだけです。つまり、最初の1人目は必ずrootユーザーに作ってもらう必要があります。

dos> mysql -u root -p mysql
mysql> grant all privileges on *.* to urano@localhost identified by 'urano398';
mysql> grant file on *.* to urano@localhost;
Query OK, 0 rows affected(0.00 sec)

mysql> exit
CREATE USER(ユーザーの作成)とGRANT(権限の付与)でコマンドが分かれている OracleやPostgreSQLに慣れている場合は注意してください。 MySQLでは、上の例のようにGRANT文で新規ユーザーの作成とそのユーザーに対する権限付与を同時にやってしまいます。 「all privileges on *.*」というのは、 全てのデータベース上の全ての表を操作する権限を持つという意味で、 最初から最強に強まったボスキャラを作るようなものですから、 実用として公開するときにはこのようなことはしないでください。 例えば上で作ったデータベース「udb」に対する全操作を可能にするには「udb.*」のように限定して指定できます。 「urano@localhost」というのがユーザー名、 「urano398」というのがパスワードですが、 MySQLユーザーは常にユーザー名とホスト名のワンセットで識別される点にも注意してください。 つまり、別々のマシンから接続してくる 「urano@a.b.co.jp」と「urano@c.d.co.jp」はMySQL世界では全くの別人として扱われます。
 なお、2つめのGRANT文は、FILE権限という、「LOAD DATA INFILE」文や 「SELECT ... INTO OUTFILE」文を使ってファイルシステム上のデータファイルに対するI/O を行う場合に必要な権限を付与するものです。 FILE権限は特定のデータベースに対するものではないので、通常*.*と指定することになります。
 ともかく、このユーザーで接続を試してみましょう。 ユーザーはurano、データベースはudbを指定して接続するには、このようにします。
dos> mysql -u urano -p udb
Password: ********
mysql> exit
Bye.
dos>

データを操作してみよう
 データベースとユーザーが作れた段階で、ひとまずセットアップは完了です。 今度は実際にデータを入れていきます。 MySQLでデータを操作するための最も基本的なツールは 「mysql」です(いままでもさんざっぱら出てきましたね?) mysqlは、OracleのSQL*Plus、PostgreSQLのpsql のようなものだというとウダウダ言うよりあっさり理解してもらえる方も多いでしょう。 データを操作する「SQL文」を入力し、 実行結果が表示されるという文字ベースの対話インターフェースです。
 まず何をするかというと、CREATE TABLE文で表を作らないといけません。 このへんは他のRDBMSと同じなので分かりやすいでしょう。

> mysql -u urano -p udb
Password: ********
mysql>CREATE TABLE ITEMS(
    ->  NAME VARCHAR(50),
    ->  PRICE INTEGER,
    ->  QTY INTEGER
    ->);
Query OK, 0 rows affected (0.06 sec)

 他のRDBMSと大きく異なる点がひとつあります。 MySQLはUNIX環境(Linuxも含む)では、テーブルなどのデータベースオブジェクトや、 カラムの名前に対して、大文字・小文字が区別されます。 これは非常に重要な点なので注意が必要です。

 データ型はVARCHAR、INTEGER、DECIMALが基本です。 NUMBER, VARCHAR2はありませんので、Oracleに慣れている方は要注意、ですね。 ちなみに主キー制約、外部参照制約、一意制約、NOT NULLやDEFAULT などもOracleなどと同じような書式で指定できます。

mysql>INSERT INTO ITEMS VALUES('メロン', 1200, 20);
Query OK, 1 rows affected (0.06 sec)
mysql>INSERT INTO ITEMS VALUES('りんご', 130, 50);
Query OK, 1 rows affected (0.06 sec)
mysql>SELECT * FROM ITEMS;
+--------+-------+------+
| name   | price | qty  |
+--------+-------+------+
| メロン |  1200 |   20 |
| りんご |   130 |   50 |
+--------+-------+------+
2 rows in set (0.06 sec)
> \q

データの入力と、検索です。日本語もちゃんと扱えていますね。
 ところでmysqlの対話入力では、長ーいCREATE TABLE定義や、 複雑な問い合わせの途中で一字でもミスると最初から打ち直しなので大変です。 このような1つ以上のSQL文をテキストファイルに書いておき、 mysqlの対話入力から呼び出すこともできます。
mysql> source komando.sql
あるいはコマンドラインから
dos> mysql -u urano -p udb < komando.sql
とmysqlを起動するやいきなりSQL文を投げ付けることもできます。ちなみに、 このSQL文のファイルにはC言語式のコメント/* 〜 */を書くことができ(★1)、 1つの文(先頭から;まで)が複数行に渡る長い文の場合でも、改行時に「\」 などを書く必要はありません。
★1 MySQL 5.0.0alphaでは、4.1台までOKだったC言語式のコメントがエラーになるようです。 これから修正されるのかもしれません。
 はてさて、mysqlのような対話入力ツールに是非備えられるべき機能があと2つあります。 ひとつは、表定義の確認。 OracleのDESCRIBEコマンド、PostgreSQLの\dコマンドとして知られるこの機能は、 MySQLではこうします。
mysql> SHOW FIELDS FROM ITEMS;
そしてもうひとつは、テキストファイルからデータベースにデータを流しこんだり、 逆にデータをテキストファイルに書き出す機能です。 まず、 データのファイルへの出力です。
mysql> SELECT * FROM ITEMS INTO OUTFILE 'C:/abc/out.txt'
ファイル名のパス区切りはWindowsでもスラッシュを使うのに注意が必要です。 このとき書き出されるテキストの内容は、デフォルトでは になります。これらは次のようなオプションで変えられます。 (TERMINATED BYを指定せずにENCLOSED BYだけを指定する場合も、 FIELDSは必要です。FIELDS ENCLOSED BY...となります)

 では実際に、今度はテキストファイルからのデータの読み込みで使ってみましょう。

mysql> LOAD DATA INFILE 'C:/abc/items-input.txt' INTO TABLE ITEMS
    -> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    -> LINES TERMINATED BY '\r\n';
わかる人にはわかると思いますが、この構文はOracleのロードユーティリティ SQL*Loaderの制御ファイルの記述方法にとてもよく似ています。 ただし、入力データファイルは絶対パスで指定しないと、 ファイル名だけの指定では、「Mysqlホーム/var/DB名/ファイルのパス」とみなされてしまいます。
また、 この入力データファイルは、クライアントだけでなく MySQLサーバ(の実効ユーザ)から見える(=statできる)位置にないといけません。 Linuxでは通常、一般ユーザのホームディレクトリは、そのディレクトリのユーザ以外には見えない (=パーミッションが0700になっている) ようになっていますが、それだとMySQLサーバの実効ユーザから普通見れないので、 エラーになってしまいます。 MySQLサーバの実効ユーザのホームの下に置いてロードするか、 パーミッションを0700から0755に変える必要があります。

 とりあえず、このように、 MySQLではカンマ区切りやタブ区切りのテキストファイルを使って、 データベース上のデータのインポートやエクスポートができます。 OracleのSQL*Loaderのように列の指定までできると嬉しいのですが、これだけでも利便性は充分確保できます。 これならママも一安心、よかったぬよかったぬ。(なんでやねん)

 最後に、そのようなスクリプトの例を一通り載せてみます。

テーブルを作成するスクリプト

CREATE TABLE SHITEN (
  SHITEN_CODE   VARCHAR(5) NOT NULL,
  SHITEN_NAME   VARCHAR(30),
  ADDRESS       VARCHAR(100),
  AREA_CODE     INT(2),
  EMPLOYEE_NUM  INT(5),
  CONSTRAINT SHITEN_PK PRIMARY KEY(SHITEN_CODE),
  CONSTRAINT SHITEN_FK1 FOREIGN KEY(AREA_CODE) REFERENCES AREA (AREA_CODE)
);

タブ区切りのテキストファイルからデータをテーブルにロードするスクリプト

LOAD DATA INFILE 'C:/usr/dbms/mysql/shiten.dat'
INTO TABLE SHITEN
FIELDS OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';

ログの設定
 アプリケーションの開発時に、SQL文が文法エラーになるなどの問題の解決のために、 MySQLサーバに受け付けたSQLのログを出力するよう設定することができます。 これはmysql.iniに、

log=C:/temp/mysqld.log

このような行を追加すればOKです。

  もくじ
MySQL   (C) 2002-2003 MISUMI URANO (2001/03/20 - 2006/01/03)
Ads by TOK2