はじめに
みなさんこんにちは。技術系Q&Aサイトteratail開発チームの本橋佑介です。
MySQLは世界で広く使われているオープンソースのRDBMSです。今では多くのPaaSやSaaSでも利用でき、
このようにWebサービスを利用する上で非常に採用頻度が高いMySQLですが、
ストレージエンジン
MySQLの大きな特徴の一つとして、
ストレージエンジンとは、
一昔前では頻繁な更新のあるテーブルはInnoDB、
- 参考:InnoDB以外のストレージエンジンを使うことはありますか?
- https://
teratail. com/ questions/ 1035
データ型
MySQLでは数値型、
SIGNED/UNSIGNED
数値型ではSIGNED, UNSIGNEDという指定により符号の有り無しの指定が可能です。たとえば TYNYINT
の場合SIGNEDだと-128~127までの整数が格納できますが、
MySQLは曖昧な型の利用をしているため、
mysql> create table signed_type (signed_ti tinyint, unsigned_ti tinyint unsigned); mysql> insert into signed_type values(200,200); Query OK, 1 row affected, 1 warning (0.06 sec) mysql> select * from signed_type; +-----------+-------------+ | signed_ti | unsigned_ti | +-----------+-------------+ | 127 | 200 | +-----------+-------------+ 1 rows in set (0.00 sec)
insert文でwarningが出ています。そこで show warnings;
をすることでwarningの内容を参照することができます。
BOOLEAN/BOOL型
真偽値TRUE,FALSEを格納するために利用することの多いBOOLEAN型ですが、TYNYINT(1)
のシノニムとなっています。また、
また、where column_
ではなくis true
と比較した場合、= true
を利用しましょう。
日付型でのゼロの扱い
PostgreSQLでは-infinity
で処理しますが、0000-00-00
、0000-00-00 00:00:00
のように格納、
大文字小文字の取り扱い
MySQLでは文字列比較で大文字と小文字を同一のものとして扱います。プログラム側で別のものとして取り扱う場合はここでも注意が必要です。バイナリ型を利用することでこの問題を回避することが可能です。
また、ハハ
パパ
ババ
を同じ文字列としてしまうため、utf8mb4_
を指定する必要があります。
全文検索
これまで全文検索を行うためにPostgreSQLを選択することが多かったですが、
mysql> CREATE FULLTEXT INDEX INDEX名 (対象カラム) WITH PARSER ngram ON ;
SQLモード
さまざまなMySQLの"癖"を回避するために厳密なSQLモードを指定することが可能です。多くの場合に予期せぬバグの原因となるMySQLの曖昧さを回避するためにsql_
を指定することができます。
TRADITIONALでは、
またSQLアンチパターンでたびたび取り上げられる曖昧なグループを許容しないONLY_
を利用することも多いです。
※ 曖昧なグループとはGROUP BYにSELECT句で指定しないカラムを指定すること。
JSON型
MySQL5.
mysql> CREATE TABLE json_type (json_data json);
MySQL5.
最後に
今回はMySQLを利用する上で忘れがち、