MySQL/dbonline/config の変更点


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


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

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

***SERVER SECTION [#ie8999bf]
 SERVER SECTIONはサーバーが利用する設定で、
 デフォルトのディレクトリや、デフォルトの文字コードなどが設定されている
 データディレクトリ(後述)なども設定されている
 MySQLサーバに関するオプションについては[mysqld]の後に記述する。
**データディレクトリ [#pfcff100]
 作成するデータベースのデータが格納されるのがデータディレクトリ
 #Path to the database rootの部分に記述されている。

**文字コード [#n45a6f75]
 MySQLをコマンドから操作する際、&color(Red){コマンドプロンプトで使用する文字コードをUTF-8にすることはできない};

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

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

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

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

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

注)
 変更後のMySQLサービスの再起動は行わなくても変更は反映されているようだが、
 一応、サービスから再起動を行っておくとよい。
**デフォルトストレージエンジン [#xc7f88c9]

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

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

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


*演算関連 [#z27cff58]

**NULL [#o817bfa2]

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

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

***比較 [#tbf2b9e8]
 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は文字列でもよい

***論理 [#n41cfff1]
 論理演算子に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のビット演算におけるビット数 [#q3691505]

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

*変数型 [#qdd459e0]

**整数型 [#z69669db]
  ・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桁より大きい値を入れると、幅に関係なく表示される。
  ※格納可能な桁数より大きい幅を入れると、設定は無視される
**浮動小数点型 [#ob5dec0c]

  ・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で表示される。
  切り上げられた幅は四捨五入される
  ※こちらは、大きな値を入れた時に幅が無視されることはなく、
   小数点以下の桁数が大きい割に、全体の幅が小さいと、
   整数部分の値が入らずにエラーになる
**日付型と時刻型 [#ec1ade34]
 フォーマットや範囲は以下を参照
 http://www.dbonline.jp/mysql/type/index4.html
 
 入力例は一通りではなく、たとえば、DATE型であれば、
 '2009-09-07', '2009/09/07', '090907',...など
 複数のフォーマットが許可されている


**文字列型 [#gee27e28]
  ・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
  としておくと、&color(Red){比較や照合時にbinaryが優先されて、大文字と小文字を区別することができる};
**Binary [#f18af426]

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

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

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

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

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


**ENUM型 [#gaae8878]

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

 ・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型 [#td1ffac6]

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

 ・リストできる数は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などと同様に設定可能
 
*表示方法 [#ja7f661c]

**MySQLの結果を縦に表示する [#yf7f44af]

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

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