MySQL/dbonline/config

Last-modified: 2010-10-21 (木) 14:08:53

注意

インストールの項目にある文字コードの設定は必ずやっておくこと。
そうしないと後で詰む。
(日本語を挿入するSQL文でエラーが出てしまう)

設定関連

設定ファイル

 MySQLをインストールしたディレクトリのmy.iniが設定ファイル。
 長いが、ほとんどがコメントで、
 CLIENT SECTIONとSERVER SECTIONに分かれていることがわかる。

CLIENT SECTION

 CLIENT SECTIONの中の
 クライアント共通のオプションについては[client]の後に記述し、
 MySQLコマンドラインツールだけに関係するオプションについては
 [mysql]の後に記述する
 #ポート番号は[client]に、文字コードは[mysql]に設定されている。

SERVER SECTION

 SERVER SECTIONはサーバーが利用する設定で、
 デフォルトのディレクトリや、デフォルトの文字コードなどが設定されている
 データディレクトリ(後述)なども設定されている
 MySQLサーバに関するオプションについては[mysqld]の後に記述する。

データディレクトリ

 作成するデータベースのデータが格納されるのがデータディレクトリ
 #Path to the database rootの部分に記述されている。

文字コード

 MySQLをコマンドから操作する際、コマンドプロンプトで使用する文字コードをUTF-8にすることはできない

 そこで、MySQLコマンドラインツールを使用する場合のデフォルト文字コードとしてcp932を設定しておく必要がある
  ※cp932は、ShiftJISの亜種で、Windows上の文字コードらしいが、
   ほとんど違いはないとのこと

 この設定をしないと、日本語でエラーが出るので注意
 以下のように設定する。

 [client]
 port=3306
 default-character-set=utf8
 [mysql]
 default-character-set=cp932

注)
 ただし、MySQLフォルダのファイルはなぜか、アクセスが禁止されている。
 notepadで保存しようとすると、「アクセスが禁止されました」と出るが、
 terapadで保存すると、普通に保存したように見えてしまうので注意
 (おそらく、terapadが負荷軽減のためにキャッシュを残しているものと思われる)

 対策としては、デスクトップなどで編集して、コピーするほうが良い。
 Windows7の面倒な部分である。

注)
 変更後のMySQLサービスの再起動は行わなくても変更は反映されているようだが、
 一応、サービスから再起動を行っておくとよい。

デフォルトストレージエンジン

 ストレージエンジンというのは、
 MySQLの実データへのアクセス処理を主に行う機能部分のことで、
 たくさんのベンダーがMySQLにストレージエンジンを提供している。
 (InnoDBやMyISAMなど)

 MySQLでは、ストレージエンジン部分をプラグインのように扱っており、
 テーブルごとに最適なストレージエンジンを設定することができる。

 ストレージエンジンを指定しなかった場合に適用されるのが
 デフォルトストレージエンジンである。

演算関連

NULL

 ・MySQLでは、NULLは、0や""とは一致しない
 ・mysql> select * from strtest where str = NULL;
  のように、NULL同士で比較してもヒットしない
  ただし、<=>という演算子は、NULL同士でもヒットできる
 ・NULLか否かを調べるためには、「IS NULL」を使う
  →select * from strtest where str is NULL;

MySQLの演算子

算術

 a / bを整数除算する場合は a DIV bと記述
 余りは、a % bとa MOD bのどちらでもOK

比較

 a <=> b は「aとbは等しい(NULL対応)」である
 a <> b は、a != bと同じ。IS NOTも同じ意味。
 
 a BETWEEN min AND maxで aはmin以上、max以下
 a NOT BETWEEN min AND maxでその逆。
 
 a IN (value, ... )
 「aは括弧内のいずれかの値に等しい」
 ※valueは文字列でもよい

論理

 論理演算子にXORがある。
 NULL AND 1 は NULL
 NULL AND 0 は 0
 
 NULL OR 1 は 1
 NULL OR 0 は NULL
 
 NULL XOR 1もNULL XOR 0 もNULL
 
 NOT NULLは NULL
 
 比較・論理演算子はいずれも、合致した場合は1が、合致しない場合は0が返される
 
 各種ビット演算子も使える。^はXORに相当する。

MySQLのビット演算におけるビット数

 MySQLではビット演算に BIGINT(64ビット) 演算を使用し、
 結果は符合なしの 64 ビット整数となる。
 →普段は意識しないが、NOTなどのビット演算では結果がかなり大きくなる

変数型

整数型

 ・TINYINT    -128~128
 ・SMALLINT  -32768~32767
 ・MEDIUMINT -8388608~8388607
 ・INT       -2147483648~2147483647
 ・BIGINT     -922372036854775808~9223372036854775807

 
 ・それぞれ、符号なしで利用することも可能
  tyniint unsignedのように、後ろにunsignedを付ける。

 ・値を超えて格納するとエラーが発生する

 ・TYNYINT ZEROFILL のようにZEROFILLを付けると桁数分だけ0がつく
  例)8 → 008

 ・SMALLINT(3)のようにすると、幅3で表示できる。
  例)00028 → 028
  ※3桁より大きい値を入れると、幅に関係なく表示される。
  ※格納可能な桁数より大きい幅を入れると、設定は無視される

浮動小数点型

 ・FLOAT
  -3.402823466E+38 から -1.175494351E-38
  0
  1.175494351E-38 から 3.402823466E+38
 ・DOUBLE(別名:DOUBLE PRECISION, REAL)
  -1.7976931348623157E+308 から -2.2250738585072014E-308
  0
  2.2250738585072014E-308 から 1.7976931348623157E+308

 ・UNSIGNEDとZEROFILLは同様に使用可能

 ・DOUBLE(5, 3)のようにすると、幅は全体が5、小数点以下が3で表示される。
  切り上げられた幅は四捨五入される
  ※こちらは、大きな値を入れた時に幅が無視されることはなく、
   小数点以下の桁数が大きい割に、全体の幅が小さいと、
   整数部分の値が入らずにエラーになる

日付型と時刻型

 フォーマットや範囲は以下を参照
 http://www.dbonline.jp/mysql/type/index4.html
 
 入力例は一通りではなく、たとえば、DATE型であれば、
 '2009-09-07', '2009/09/07', '090907',...など
 複数のフォーマットが許可されている

文字列型

 ・CHAR(M)   [別名:CHARACTER(M)]
  固定長文字列
  Mは「文字数」を指定。0から255文字
 ・VARCHAR(M) [別名:CHARACTER VARYING(M)]
  可変長文字列
  Mは「バイト数」を指定。0から65535バイト

 ・CHAR(5)であれば、パディング(空白文字)を付加して、
  常に5文字になるようにして格納している
  (ただし、比較時や抽出時は空白を削除するので意識することはない)

 ・VARCHARは、空白も含めて、格納&抽出するが、
  比較時は、末尾の空白を削除して比較する

 ・MySQLは比較時に大文字と小文字を区別しないが、
  BINARY属性を指定しておくと、'A'と'a'を区別できる
 
 ・CHAR(M) [CHARACTER SET 文字セット] [COLLATE 照合順序]
  で、文字セットや照合順序を設定できる。

  たとえば、
  CHAR(M) CHARACTER SET utf8 COLLATE utf8_bin
  としておくと、比較や照合時にbinaryが優先されて、大文字と小文字を区別することができる

Binary

 ・BINARY[(N)]
 ・VARBINARY(M)

 バイナリで保持する文字列型である。
 文字列の形ではなく、バイナリの形で保持するという以外の違いは
 あまり見えない。(CHARのBINARY属性と大差がない)

 取り出すときは、サーバー側の文字セットに直されるので、
 通常の文字列として表示される

BLOB型

 バイナリを扱う文字列型で、かつ、
 文字数は指定しないが、最大長が決まっているもの
 http://www.dbonline.jp/mysql/type/index6.html

TEXT型

 BLOB型の文字列(バイナリでない)バージョン
 TEXT型も文字セットや照合順の設定は前述のVARCHARと同じ

ENUM型

 ・文字列定数をリストする

 ・mysql> CREATE TABLE test(col ENUM('red','blue','yellow'));
  のようにENUM型を使うと、
  mysql> INSERT INTO test(col) VALUES('blue');
  のように、要素のどれかしか格納できなくなる。
  (Strict modeが有効な場合にはエラー。無効の場合には空白が代入される)

  ※Strict modeは、my.iniで設定する

 ・要素に関係なく、NULLは代入することが可能

 ・SELECT * FROM test WHERE col = 'blue';
  SELECT * FROM test WHERE col = 2;
  のようにインデックスで要素を抽出したり、格納したりすることが可能
  ※インデックスは、1から始まる(0からではない)

 ・文字セット、照合順序もVARCHARなどと同様に設定可能

SET型

 ・文字列定数をリストする

 ・リストできる数は64と小さい(ENUM型は65535まで)

 ・ENUMは「要素からどれか1つ」だが、SETは「要素のうち複数指定もOK」
  http://www.dbonline.jp/mysql/type/index8.html

  INSERT INTO test(col) VALUES('red');
  INSERT INTO test(col) VALUES('red,blue,yellow');

 ・要素にないデータを指定した場合に、Strict modeでエラーが出るのは
  ENUMと同じ

 ・mysql> INSERT INTO test(col) VALUES('blue,red');
  のように要素を逆順で指定しても、定義した順番で格納される。

 ・インデックスは、1,2,4,...というように、振られる
  上記の例で、'red, yellow'を指定する場合は5を指定する

 ・文字セット、照合順序もVARCHARなどと同様に設定可能
 

表示方法

MySQLの結果を縦に表示する

 SQL文の最後には、「;」を付けるが、
 「\G」とすると、結果を1レコードごとに縦に表示してくれる。

 ※「\g」のように小文字にすると「;」と同じになるので注意