2005-11-08更新 2005-10-27作成
ここでは MySQLの
・コマンドラインからのデータベース操作(テーブル作成等)
・コマンドラインからのデータ操作
・ユーティリティでのデータ操作(LOAD、UNLOAD、BACKUP)
について基本的なところを説明します。
内容はMySQL5.0として書いてありますが、基本操作についてはMySQL4.1や4.0でも同じだと思います。5.0固有のものがあれば、その部分は本文中に注釈を入れることにしますので参考にしてください。
MySQL の最も基本的な操作は、コマンドプロンプトから MySQL monitor というコマンドラインツールを起動して行います。これはMySQLインストールディレクトリ\binにある、mysql.exe を実行します。以下は環境設定で、管理者ユーザー:rootにパスワードを設定しているときの例です。
C:\>
C:\>cd "C:\mysql\MySQL Server 5.0\bin"
C:\mysql\MySQL Server 5.0\bin>mysql -u root -p
Enter password:
mysqlコマンドの -u キーワードでログインユーザー名を指定します。次の -p キーワードがパスワード入力をします、という意味です。そうすると Enter Password: というプロンプトが出るので、パスワードを入力してください。
C:\>
C:\>cd "C:\mysql\MySQL Server 5.0\bin"
C:\mysql\MySQL Server 5.0\bin>mysql -u root -p
Enter password: ***
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.14-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
これが正しいユーザー名とパスワードを入力して、MySQLに接続された状態です。 パスワード入力のプロンプトを待たず、コマンドラインツール起動時にパスワードも指定する方法も参考までに書いておきます。例は管理者ユーザー:rootのパスワード:yokとなっている場合です。
C:\>"C:\mysql\MySQL Server 5.0\bin\mysql" test_db -u root -pyok
ポイントは-p キーワードの後ろに、空白を空けずに パスワードを続けて指定することです。
そしてMySQL monitor を終了するときは EXIT コマンドもしくは QUIT コマンドを入力してください。
この MySQL monitor 上からSQLを発行することにより、テーブルの作成(CREATE TABLE)、データ操作(INSERT、DELETE、UPDATE)、データ照会(SELECT)・・・が行えます。Oracle経験者の人にとっては「SQL Plusと同じようなもの」といえば話が早いでしょう。
もう一つの方法が、このコマンドラインツールと似ていますが、コマンドラインクライアントを起動する方法です。
「スタートメニュー」−「プログラム」−「MySQL」−「MySQL Server 5.0」と進むと、「MySQL Command Line Client」というメニュー項目があります。これを選択してツールを起動します。
こちらの場合コマンドプロンプトが起動されて、自動的に root ユーザーで接続しに行き、パスワードを聞いてきます。インストール時にrootユーザーにパスワードを設定してある場合はそのパスワード、設定していなければ空Enterを入力してください。
これ以降の操作はコマンドラインツールと同じです。
違いはデータベースの文字コードにutf8を指定している場合に出てきます。日本語データを持つテーブルの内容を表示した場合、コマンドラインツールでは文字化けして表示されます(日本語データのINSERTやUPDATEをした場合も同じです)。コマンドラインクライアントを使用すると、設定ファイルを正しく修正しておくことにより文字化けを回避できます。
「◇MySQLの設定 」で説明した内容ですが、my.iniという設定ファイルを修正します。これの [mysql] セクションが
[mysql]
default-character-set=utf8
となっているのを、
[mysql]
#default-character-set=utf8
default-character-set=sjis
にしてください(くれぐれも [mysql] セクションと [mysqld] セクションを間違えないように)。
ここで作成済みのDATABASEを表示してみましょう。そのためには MySQL の SHOW コマンドを使います。
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.01 sec)
mysql>
この mysql と test というのは標準で作成済みの、サンプルDATABASEになります。 test DATABASE をそのまま使ってもいいんですが、自分用にもう一つDATABASEを定義することにします。
mysql> create database test_db;
Query OK, 1 row affected (0.01 sec)
mysql>
これで test_db というDATABASEが作成されました。もう一度 SHOW コマンドで確認してみてください。これからはこれを使って説明していきます。
次にTABLEの作成に移るのですが、その前にどのDATABASEにTABLEを作成するかという問題があります。 SHOW DATABASES; コマンドで見たように、この段階でDATABASEは3つあり、そのどれを対象にTABLEを作成するか、ということです。
そのために対象とするDATABASEに接続をします。
・方法1
コマンドプロンプトから MySQL monitor を起動するときに、引数として接続先DATABASEを指定する。
今作成した test_db に接続するときは
C:\>"C:\mysql\MySQL Server 5.0\bin\mysql" test_db -u root -p
と入力します。
・方法2
既に引数を指定しない状態で MySQL monitor が起動されているときは、 CONNECT コマンドにより対象DATABASEに接続します。
mysql> connect test_db
Connection id: 3
Current database: test_db
mysql>
CONNECT コマンドは、現在接続中のDATABASEから別のDATABASEに接続先を変えたいときにも使えます。
次にTABLEの作成に移ります。他のRDBを経験している人は「TABLESPACEは?」と思うかもしれません。 MySQL にはTABLESPACEという考え方はありません。DATABASEを作成後は、すぐにTABLE作成に移ります。
TABLE作成のSQL(CREATE TABLE)は、前に述べたテーブルタイプの指定を除いて標準SQLととくに変わりません。デフォルトテーブルタイプは InnoDB にしてあるので、特に指定する必要はないでしょう。
CREATE TABLEのSQLで、MySQL独自キーワードでちょっと便利なのが IF NOT EXISTS です。
CREATE TABLE IF NOT EXISTS テーブル名 ( 項目定義, ・・・);
とすると、そのテーブル名が存在しないときだけ作成されます。
<注意>
MySQLのデータ型で、文字列型には注意がいります。CREATE SQLの指定とは無関係に、暗黙の型変換(CHAR・VARCHAR・TEXT)が行われることがあるためです。詳しくはMySQL ドキュメントの「6.5.3.1. カラムの暗黙的な変更」を参照してください。
TABLEを作成したら後はデータ操作系のSQLでデータを作成しましょう。
さてここまでは MySQL monitor 上で対話的にコマンドやSQLを入力してきました。しかしこれではある処理を再実行したいとき、TABLEをDROPして再作成したりINSERTでデータを入力したりするときに不便です。
そのためにSQLをテキストファイルに記述しておいて一括実行する方法があるので、これを説明しておきます。
まずSQL文を拡張子 .sql のテキストファイルで事前に作成しておき、これを任意のディレクトリ(例ではC:\WORK\SQL)に置いておきます。
・方法1
MySQL monitor を起動する代わりに、mysql.exeをバッチモードで実行します。第一引数に接続先DATABASE、第二引数にこのファイル名を指定することによりSQLを実行させることができます。コマンドプロンプトから
C:\>C:\mysql\bin\mysql test_db < C:/WORK/SQL/SQLファイル名.sql
としてください。
ここで注意が必要なのがSQLファイルを指定するパス名で、通常WindowsやDOS環境ではディレクトリ名区切りには \ を使いますが、 MySQL monitor のときは \ の代わりに / を使うことです。
・方法2
次はMySQL monitorを実行中にテキストファイルに記述したSQLを一括実行する方法です。
この場合はMySQL monitorの source コマンドを使用し、 source SQLファイル名; とします。MySQL monitorのコマンドとして入力するため、最後にコマンド終了を表す ; を付けることを忘れないでください。例えば
mysql> source C:/WORK/SQL/SQLファイル名.sql;
となります。
この方法2でも方法1と同様、SQLファイルを指定するパス名には、 \ の代わりに / を使います。
MySQL の基本的な操作として、テーブルのロードとアンロードについて説明します。ただしここでは基本的な、必要最低限のユーティリティコマンドの使い方しか説明しません。より細かい情報はMySQLのドキュメントを参照してください。
まずデータのロードです。厳密にはLOADユーティリティではなく、LOADコマンドになります。
例としてWindows環境で、 C:\mysql\LOAD_DATA ディレクトリ下にあるデータをテーブルに入れるコマンドを先に示します。
LOAD DATA LOW_PRIORITY INFILE 'C:/mysql/LOAD_DATA/ロード用データファイル名.txt'
REPLACE
INTO TABLE テーブル名
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
ESCAPED BY '\\';
1行目の LOAD DATA がLOADコマンドの指定です。
次の引数、 LOW_PRIORITY はコマンド優先順位が低いことを指定しています。この指定の場合はLOADコマンドは、対象テーブルをテーブル単位にロックします。他のプログラムが該当テーブルを操作している場合は、このコマンド実行が待たされることになります。
そして INFILE で指定するのがLOADするデータが入っているファイルです。拡張子も含めて(例では txt にしています)フルパスで指定してください。それとディレクトリ名区切りを \ ではなく / で指定するのは、上で説明したコマンドラインツールの場合と同じです。
ここで注意です。
MySQLの設定で文字コードにUTF8を指定した場合、このロード用データファイルは必ずunicode(UTF8)で作成しておいてください。そうしないと日本語データを含む場合、そこが文字化けします。
文字コードにsjisを指定した場合、Windows環境では通常Shift-JISで保存されるので特に気にする必要はありません。
2行目の REPLACE は、テーブルの内容をロード用データファイルで全件置き換えするという指定です。
3行目の INTO TABLE で、格納先のテーブル名を指定します。
4行目の FIELDS TERMINATED BY で、ロード用データファイル上で、テーブルの各カラムがどのように区切られているかを指定します。例では ',' と指定しているのでカンマ区切り、つまりCSV形式という意味になります。
5行目の LINES TERMINATED BY で、ロード用データファイル上で、各行の行末がどうなっているかを指定します。Windows環境では行末は CFLF になるので、これを \r\n と制御文字指定で指定しています。
6行目の ESCAPED BY でエスケープ文字を指定します。データ中にカラム区切り文字に指定した文字自体を含む場合、これがないと困ります。この例では , がそれに当たります。 , がカラム区切りのカンマかデータのカンマか区別がつかないためです。エスケープ文字に例のように \ を指定した場合、カンマは \, と入力しておきます。
さらにデータ中にエスケープ文字自体、つまり \ を含む場合は \\ と入力してください。
つづいてデータのアンロードです。実はMySQLにはUNLOADユーティリティはありません(UNLOADコマンドもありません)。SELECTコマンドを実行し、結果をファイルに出力することでUNLOADを行います。
これもWindows環境で、 C:\mysql\UNLOAD_DATA ディレクトリ下にアンロードする例を先に示します。
SELECT *
INTO OUTFILE 'C:/mysql/UNLOAD_DATA/アンロードファイル名.txt'
FIELDS TERMINATED BY ','
ESCAPED BY '\\'
FROM アンロードするテーブル名;
上記の例を見てもらうと分かるように、UNLOADには通常のSELECTコマンドを使用します。そこに例の2〜4行目を追加することにより、SELECTの結果をファイルに出力し、UNLOADを行う、という仕組みです(ちなみにOracleもこれと同じような仕組みです)。
2行目の INTO OUTFILE で、SELECT結果の出力先ファイル名を拡張子を含めて(例では txt にしています)フルパスで指定します。この場合もディレクトリ名区切りは \ ではなく / で指定します。
MySQLの設定で文字コードにUTF8を指定した場合、このアンロードファイルはunicode(UTF8)で作成されます。sjisを指定していればShift-JISで作成されます。
それから既に同名ファイルが存在するとエラーになってしまいます。アンロードファイルの置き換えはしてくれません。
3行目の FIELDS TERMINATED BY で、アンロードしたデータファイル上で、テーブルの各カラムをどのように区切るかを指定します。例では ',' と指定しているのでカンマ区切り、つまりCSV形式で出力という意味になります。
4行目の ESCAPED BY でエスケープ文字を指定します。テーブル中にカラム区切り文字に指定した文字自体を含む場合、これがないと困ります。この例では , がそれに当たります。 , があり得る文字列データを格納している場合、, がカラム区切りのカンマかデータのカンマか区別がつかないためです。エスケープ文字に例のように \ を指定した場合、カンマは \, と出力されます。
さらにデータ中にエスケープ文字自体、つまり \ を含む場合は \\ と出力されます。
アンロード時の指定と、アンロードデータをロードするときの指定は必ず合わせておいてください。
(ちなみに ESCAPED BY の指定はなくても、 , は \, 、 \ は \\ と出力されました。ただやはり明示的に指定するようにした方が良いでしょう)
<注意>
なおアンロードしたときに文字列データは末尾の空白が切り捨てられます。従ってn桁の空白が入っているカラムは、長さ0文字列として出力されます。
これは特にメインフレーム、HOSTシステムとデータ連動をしたりするときに問題になるかもしれません。空白に意味があり固定長で出力したい場合、SELECT文のカラム指定で個別に関数を使う必要があります。