新鮮

頑張らないために頑張る

週次体重報告、正月休みはやはり鬼門だ。

体重管理ログです。ネットで公開すると痩せるかどうかの実験です。

f:id:hiizumix:20180121184750p:plainf:id:hiizumix:20180121185651p:plain

01/21(日) 70.5 kg / 20.1%

正月前は 67 kg だったことを考えるとかなり太ってしまった。

よかったのは、平日は何度か筋トレができたこと。筋トレした次の日は体重が落ちているのを確認した。記録はしておらず、都合よく記憶しているだけかもしれないので、次回からは筋トレしたかどうかを残しておくことにする。

悪かったのは、週末・休日と食べすぎてしまうこと。ふるさと納税の御礼品(ビール・肉)がヤバイ。これを禁止すると精神的に病みそうなので、ホドホドに抑えることにする。

MySQL で SQL 文を再利用する(プリペアード・ステートメント)

データベース系の資格といえば ORACLE MASTER が有名ですが、実は MySQL にも ORACLE MASTER 相当の資格があります。

  • (1Z0-882) Oracle Certified Professional, MySQL 5.6 Developer
  • (1Z0-883) Oracle Certified Professional, MySQL 5.6 Database Administrator

諸般の事情で MySQL 5.6 Developer をとらなければならなくなったので学習メモを残しておきたいと思います。資格の勉強をする方や MySQL を利用する方の参考になればと思います。

今回は「プリペアード・ステートメント」です。

プリペアード・ステートメントとは

同じSQL文だったり似たようなSQL文だったりを何度も実行する必要があるとき、つどつど全文を打つのはかったるいので、MySQL では SQL を再利用するしくみが用意されています。この仕組みをプリペアード・ステートメントとよびます。

具体的に試してみます。

mysql> prepare p1 from 'select 1+1';
mysql> execute p1;
+-----+
| 1+1 |
+-----+
|   2 |
+-----+
mysql> execute p1; /* 簡単に同じSQLをうてる */
+-----+
| 1+1 |
+-----+
|   2 |
+-----+

変数を与えることもできます。

mysql> create table t (a int);
/* ? でプレースホルダをつくって */
mysql> prepare t1 from 'insert into t(a) values(?)';

mysql> set @hoge=1;            /* 変数をセット */
mysql> execute t1 using @hoge; /* using で変数を使う */
mysql> select * from t;
+------+
| a    |
+------+
|    1 |
+------+

SQL インジェクション対策にも使えるようです。

注意点 1 再接続すると消える

プリペアード・ステートメントはセッション単位で管理することから、再接続すると失われてしまいます。

mysql> prepare x from 'select 1+1';
mysql> execute x;
+-----+
| 1+1 |
+-----+
|   2 |
+-----+
mysql> exit
# mysql -u root -p
Enter password:
mysql> execute x;
ERROR 1243 (HY000): Unknown prepared statement handler (x) given to EXECUTE

注意点 2 タイポすると消える

同じ名前でプリペアード・ステートメントを作成すると上書きとなりますが、タイポすると昔のものも消えます。

mysql> create table t(a int);
mysql> prepare x from 'insert into t(a) values(1)';
mysql> execute x;
Query OK, 1 row affected (0.01 sec)

/* カラム a ではなく、カラム b とタイポして上書きすると */
mysql> prepare x from 'insert into t(b) values(1)';
ERROR 1054 (42S22): Unknown column 'b' in 'field list'

/* 上書き前のものも消えてしまう・・・ */
mysql> execute x;
ERROR 1243 (HY000): Unknown prepared statement handler (x) given to EXECUTE

注意点 3 すべてのSQLで使えるわけではない

全てのSQL構文で使えるわけではなく使えないSQL文もあります。代表的なところをまとめます。

object create alter drop
table OK OK OK
view OK NG OK

マイナーどころだと、

OK?
call OK
load data infile NG

プリペアード・ステートメントが利用できる詳細範囲は マニュアル 参照のこと。

試験用チェックリスト

  • MySQL では SQL 文を再利用する仕組みとしてプリペアード・ステートメントがある
  • 構文は、prepare hoge from '[sql-text]'
  • 変数(プレースフォルダ)を使うこともできる
  • [注意] 再接続すると定義したプリペアード・ステートメントは失われる
  • [注意] 上書き時にタイポすると上書き前のプリペアード・ステートメントが消える
  • [注意] ALTER VIEW や LOAD DATA INFILE は使えない

MySQL勉強 コメント

MySQLのコメント文の扱いを確認してみる。

MySQL コメント形式

3つの書式がある。

mysql> SELECT 1+1;     # 行末までコメント
mysql> SELECT 1+1;     -- 行末までコメント
mysql> SELECT 1 /* インラインのコメント */ + 1;
  • 「-- 」は空白文字があることに注意
  • /*~*/」は複数行にわたったコメント記載もできる

ヒント句

SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
  • 手動で結合方法を指定
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
  • Version指定。上記の例だと MySQL 3.23.02 以降でのみ解釈する

試験用チェックリスト

  • 3種類 : #, -- , /*~*/
  • /*!32302~*/ : 3.23.02 以降でのみ有効にする

参考

MySQL勉強 予約語の扱い

MySQL予約語の扱いを確認してみる。予約語とは "from" のようにプロダクトの中であらかじめ意味をもつ単語のことで「from テーブル」のようなテーブルは作れない。select * from from; とかになってしまうので。具体的な予約語MySQL マニュアル に詳しく書かれている。

試してみる

mysql> create table interval (begin int, end int);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'interval (begin int, end int)' at line 1

予約語(interval)はテーブル名やカラム名に使えない。だが、バッククオートで囲むと予約語がテーブル名などで使える。

mysql> create table `interval` (begin int, end int);
mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| interval       |
+----------------+

データを入れるときは、バッククオートで囲うかデータベース名を含めて指定する。

mysql> insert into `interval`(begin,end) values(1,2);
mysql> insert into mydb.interval(begin,end) values(2,2);
mysql> select * from `interval`;
+-------+------+
| begin | end  |
+-------+------+
|     1 |    2 |
|     2 |    2 |
+-------+------+

ちなみに、sql-mode = ANSI_QUOTES のときはダブルクオートでも使える。

mysql> set session sql_mode='ANSI_QUOTES';
mysql> select * from "interval";
+-------+------+
| begin | end  |
+-------+------+
|     1 |    2 |
|     2 |    2 |
+-------+------+

試験用チェックリスト

  • テーブル名で予約語は使えないがバッククオートで囲むと使える
  • sql-mode = ANSI_QUOTES ではダブルクオートをバッククオートと解釈する

MySQL勉強 大文字小文字の区別

MySQL case-sensitive / non-case-sensitive

  • DB 名やカラム名などのオブジェクト名について大文字文字小文字の扱いが異なる。
  • さらにOSによっても大文字小文字の扱いが異なる。
  • 大文字小文字を区別することを case-sensitive という。
  • 大文字小文字を区別しないことを non-case-sensitive という。

オブジェクト名 / OS の大文字小文字の扱い

オブジェクト unix windows
データベース名 区別する 区別しない
テーブル名 区別する 区別しない
カラム名 区別しない 区別しない
インデックス名 区別しない 区別しない
トリガー名 区別する 区別しない
ストアドルーチン名 区別しない 区別しない
イベント名 区別しない 区別しない

なぜOSに依存するオブジェクトがあるかというと、一部のオブジェクトはOSのディレクトリ名やファイル名を使うからとのこと。

実験

Docker環境(unix系)で試してみる。

mysql> create database t;
mysql> create database T;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| T                  | /* 大文字 T データベース */
| mysql              |
| performance_schema |
| sys                |
| t                  | /* 小文字 t データベース */
+--------------------+

T と t の2つのデータベースができました。

次に区別しない(non_case-sensitive)もみてみます。

mysql> use t;
mysql> create table test( a integer, b integer, primary key(a) );
Query OK, 0 rows affected (0.04 sec)

mysql> drop table test;
Query OK, 0 rows affected (0.01 sec)

mysql> create table test( a integer, A integer, primary key(a) );
ERROR 1060 (42S21): Duplicate column name 'A'

カラム名が重複していると怒られました。カラム名は大文字小文字を区別しないので、a と A は同じカラム名と認識します。同じカラム名は使えないので ERROR になりました。

試験用チェックリスト

  • 一部OSでは、データベース名などは大文字小文字を区別する
  • すべてのOSで、カラム名などは大文字小文字を区別しない

15分で作れるMySQL資格勉強環境

こんにちは。hiizumixです。

データベース系の資格といえば ORACLE MASTER が有名ですが、実は MySQL にも ORACLE MASTER 相当の資格があります。

  • Oracle Certified Professional, MySQL 5.6 Developer
  • Oracle Certified Professional, MySQL 5.6 Database Administrator

諸般の事情で MySQL 5.6 Developer をとらなければならなくなったので学習メモを残しておきたいと思います。

環境概説 (Docker for Mac)

勉強するにあたり Docker for Mac でかんたんな MySQL 環境をつくってみます。

MySQL on Virtual Box でもいいのですが、最近はコンテナ仮想化が熱いらしいので Docker でつくります。Docker for Mac は Docker まわり一式をサクっと作ってくれるアプリです。

Windows では Docker for Windows が使えますが、Windows 10 Pro 限定のようです。Windows 10 Home などでは Docker Toolbox (ちょっと前の一式ツール)を使うことで同じことができるようです。(2018/01時点)

Docker for Mac のインストール

Docker Store で docker.dmg をダウンロードする。

f:id:hiizumix:20180113184527p:plain

ダウンロードした docker.dmg をインストールする。

f:id:hiizumix:20180113184608p:plain

Docker を起動する。

f:id:hiizumix:20180113184624p:plain

MySQL のインストール

メニューバーのクジラアイコンから Kitematic (Docker GUI) を起動する。

f:id:hiizumix:20180113184650p:plain

MySQL がいるので CREATE してみる。

f:id:hiizumix:20180113184710p:plain

怒られた。ROOTパスワードがないらしい。

Settings タブの General > Environment Variables で MYSQL_ROOT_PASSWORD を追加設定する。まあ root でいいだろう。

f:id:hiizumix:20180113184738p:plain

すると、

f:id:hiizumix:20180113184754p:plain

起動したっぽい。EXEC でターミナルが起動するので mysql に接続する。

# mysql -u root -p -P 32769

f:id:hiizumix:20180113184823p:plain

入れた。

感想

  • 仮想環境つくってデータベース構築するのは丸一日かかる作業かと思っていましたが、ものの数分であっという間に出来てしまいました。

はじめに

f:id:hiizumix:20180104220829j:plain

働き方改革なるコトバがある。

いわく、過労死防止だったり生産性向上だったり自己啓発だったりを目的に「さっさと帰れ」ということだ。僕が勤めている企業は外面を気にするため、トップダウンで残業制限を徹底しはじめた。すでに裁量労働だった僕は残業代がないこともあり「さっさと帰れ」は両手を上げて喜ぶべき施策である。…だった。

実際にさっさと帰ると、一つ困った事態に陥る。

要はヒマなのだ。日付が変わる時間まで、精神をすり減らし、社内政治に明け暮れ、無意味な作業に邁進してきた。休日は、ただ寝腐る日々。「いつか辞めてやる!」と考えていた。辞めて、お気楽に、好きなことをして生きよう、と。

好きなことは何なのか?

早く帰ってもすることがない。断捨離した部屋には何もないし、友人たちは遠方だ。いままで脇において生きてきた根源的な疑問「なんのために生きているのか?」に襲われる。あまりにヒマすぎて就活中の学生みたいな自分探しが始まってしまった。

ある意味、ラッキーである。

辞めて、お気楽に、好きなことをして生きよう。のシミュレーションが出来た。そして「辞めたところでヒマ」という寂しい現実があることがわかったのはラッキーだ。しかも、まだ定年前の身体が動くうちに、この現実に気がついたのはますますラッキーな話である。…多少の絶望を感じつつも。

ヒマつぶしである。

ここまで読んでいただいた方には申し訳ないが、この文章はつまりヒマつぶしである。ガッカリした顔が浮かぶが総じて物事とはそういうものだろう。ヒマつぶしではあるが、いままで「他人の仕事」に使っていた時間を「自分の仕事」におきかえていきたいとは思う。いままで知らなかったこと、あったことのない人、内なる欲望など、新鮮な何かを楽しみたい。まあそんな気分なのである。