MySQL

2012-02-13, mysql

レガシーなまとめ

恐らく日本で最もメジャーなRDBMSです。高速かつ多機能であることは間違いないですが、エンコードの指定が複雑怪奇であったり、かなりアクの強い独自仕様が多いような印象を受けます。

情報を確認

SHOWコマンドで各種情報を確認できます。詳細はリファレンスを参照。

> SHOW databases;
> SHOW CREATE DATABASE db_name;
> SHOW table status;
> SHOW CREATE TABLE table_name;
> STATUS;

またデータベース「mysql」の中のテーブルからもユーザ情報等を確認することが可能です。

> USE mysql;
> SHOW tables;

テーブルの定義は以下のようにして確認します。

>SHOW FIELDS FROM [テーブル名] -- DESCRIBE [テーブル名] も同様
>SHOW INDEX FROM [テーブル名]

列数が多いテーブルの中身を参照する場合、クエリの終端に「\G」をつけると、一行ずつ縦に展開して結果を表示します。

>SELECT * FROM xxx\G

rootユーザのパスワードを設定

# mysqladmin -uroot password (パスワード)

データベースを作成する

エンコードを指定する場合、以下のようにクエリを発行します。

mysql> CREATE DATABASE fumincup_com DEFAULT CHARACTER SET utf8;

一般ユーザを作成する

GRANTコマンドを利用して権限の付与を行うことでユーザが作成されます(database,username,passwordは置き換えて下さい)。

# mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON database.*
  TO username@localhost
  IDENTIFIED BY 'password' WITH GRANT OPTION;

外部(別のマシン)からも接続を行いたい場合、localhostの部分を任意のホスト名(またはIP)に設定することができます。任意のホストからの接続を許可する場合、ホスト名に「%」を指定します。

mysql> GRANT ALL PRIVILEGES ON database.*
  TO username@{strong:xxx.com}
  IDENTIFIED BY 'password' WITH GRANT OPTION;

ダンプとリストア

1.リストア先のデータベースが存在する場合

# mysqldump -uroot -p (データベース名) > xxx.sql

※予め「CREATE DATABASE」及びユーザの作成を行う必要があります。

# mysql -uroot -p (データベース名)< xxx.sql

2.リストア先が存在しない場合

# mysqldump -uroot -p --databases (データベース名) > xxx.sql
# mysql -uroot -p < xxx.sql

2の方法だと、「CREATE DATABASE」の手間が省けます。また「--all-databases」オプションを(--databasesの代わりに)指定して全てのデータベースをダンプすることもできます。

方言とチップス

キーワードを含む列やテーブルの指定

ダブルクォートではなく「`(バッククォート)」で囲む。

mysql> CREATE TABLE (`key` VARCHAR(255));

可変長文字列

-VARCHARは使用できないTEXTを使うか、VARCHAR(255)のように長さを指定する。 -可変長文字列(TEXT)をプライマリキーに設定することはできない。

文字列の結合

-結合演算子「||」は使えない。CONCAT関数を利用する。

データベース名

-MySQLのデータベース名は大文字小文字を区別する。・・・。

MySQL4.xから5.0への移行

権限設定テーブルの構造が違っているらしいので、以下のコマンドを実行(その後全てGRANTし直す必要があった)。

$ mysql_fix_privilege_tables --password=XXX

エンコード(文字化け対策)について

Windows版はUTFに対応していますが、LinuxRPMだとlatin1がデフォルトになってしまい、そのままデータベースを作ると日本語を扱えません。以下のようにデータベース生成時及び接続時に文字セットを明示する必要があります。 > CREATE DATABASE db_name CHARACTER SET utf8;

JDBCから利用する場合、以下のように通信用のエンコードも指定が必要な場合があります。 :jdbc:mysql://hostmane/db_name?characterEncoding=utf8 >2007.4.22修正 >以前は「useUnicode=true」も同時に指定していまたが、このオプションを指定すると文字化けが発生してしまう事が分かり外しています。ドライバのドキュメントによると「useUnicode」はデフォルトでtrueのようです。

PHPから利用する場合、PHP(httpd)のデフォルトエンコーディングに合わせた設定にしておきます(下記はShift_jisの場合です)。 /etc/my.cnf

default-character-set = cp932
skip-character-set-client-handshake

DATETIME型とTIMESTAMP型の使い分け

MySQLではテーブル中、最初に現れるTimestamp型は特別な扱いを受ける。恐らく、レコードの更新時刻保持に特化した用途を想定していると思われる。単純に日付時刻を格納したい場合はDATETIME型を利用すること。

TIMESTAMP 型カラムでは、他のカラム型とは異なる方法で NULL 値が処理される。TIMESTAMP 型カラムには、NULL は格納できない。カラムに NULL を挿入すると、カラムの値として現在の日時が設定される。

コマンドラインで日本語

ターミナルなどから接続した場合に日本語を含む結果セットを正しく表示する方法です。

$ export LANG=ja_JP.UTF8
$ mysql -uroot database
mysql> SET character_set_results = 'utf8';
mysql> (結果に日本語が含まれる任意のクエリ)
mysql> exit
(ここで毎回設定がリセットされます。)

以下は、現在設定されている、キャラクタセットに関する変数を確認するコマンドです。

mysql> SHOW VARIABLES LIKE 'character_set%';

参考リンク

この記事は役に立ちましたか?