注意
インストールの項目にある文字コードの設定は必ずやっておくこと。
そうしないと後で詰む。
(日本語を挿入する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」のように小文字にすると「;」と同じになるので注意