プログラムで整数と言えばint型を使うのが基本ですが、MySQLには扱えるサイズによって4種類ものint型が使えます。そして、その中で最も小さいのがtinyintです。今回は、他のint型とは違った使われ方もする、このtinyintについて解説します。
intには扱える数に制限がある
データベースで数字を扱う際、整数ならinteger、小数点以下の数字を含む数ならfloatを使うのが一般的です。これはプログラム言語も同じです。しかし、プログラム言語とMySQLでは、整数として扱える数字の範囲が違うので大きな数を扱う場合は注意しましょう。
さらに、MySQLでは、整数を扱うデータ型として、tinyint、mediumint、int, bigintが使えます。次から、それらの違いについて解説します。
コンピュータにおける整数
コンピュータで整数を扱う場合、CPUのビット数によって扱える数の範囲が変わります。今のパソコンなら64bitなので、2の64乗の数が扱えることになり、ほぼ無限大まで扱えると考えてよいでしょう。
しかし、昔のパソコンには8ビット、16ビット、32ビットのCPUも使われていました。それらのCPUで扱える整数は、それぞれ2の8乗、2の16乗、2の32乗です。例えば、2の8乗は256ですから、8ビットのCPUでは-128から127までの数字しか扱えません。さらに、2の16乗は65,536なので、16ビットのCPUが扱える数字は-32,768から32,767に限定されます。
なお、多くのプログラミング言語では、整数と言えば64bitの数なのでほぼ無限大です。しかし、これは64ビットが前提で、扱えるビット数が違っていれば、扱える整数の範囲も変わります。そのため、MySQLで整数を使う場合、扱えるビット数によってtinyint、mediumint、int、bigintの4つの整数型が用意されています。
整数のビット数が多いと扱うデータが増える
今のパソコンやサーバーは、数ギガバイトのメモリーを搭載し、数テラバイトのディスクスペースが使えます。そのため、データベースで扱う数字が64ビットでもほとんど問題ありません。
しかし、MySQLが使われるのは、そういったパソコンやサーバーばかりではありません。メモリーに制限がある組み込みシステムなどでも使われます。そして、そういった用途では、扱うデータのサイズの最適化が欠かせません。また、大量のデータを扱う場合でも、扱うデータのサイズが小さければ、それだけ効率的に動作します。
そのため、一口に整数といっても、MySQLでは扱う数字の大きさに合わせて、最適なデータ型を使うのが賢い使い方です。ぜひ、よく使われるintだけでなく、tinyintやbigintなどの利用も検討してください。
int型とビット数の関係
次に、MySQLが扱える整数のデータ型を次に紹介します。
型、バイト、最小値、最大値
- TINYINT、1、-128、127
- SMALLINT、2、-32768、32767
- MEDIUMINT、3、-8388608、8388607
- INT、4、-2147483648、2147483647
- BIGINT、8、-9223372036854775808、9223372036854775807
tinyintは1バイト
先ほど紹介したように、MySQLのtinyint型は1バイト、すなわち8bitです。そのため、扱える数字は最大256であり、実際には-128から-127しか表現できません。データベースによく格納する金額や個数、回数などには、扱える数が少なすぎて、適用できません。しかし、このような小さな数字でも、使える用途が幾つもあります。次から、tinyintの用途について解説します。
コンピュータが扱うデータはバイト単位
ITエンジニアにとっては常識と言えることですが、コンピュータが扱うデータの基本単位は1バイトであり、1バイトは8ビットのことです。メモリーのLSIに記憶セルが8ギガビットあれば、そのLSIに1ギガバイト格納できます。つまり、1バイトを扱うMySQLのtinyintは、コンピュータが扱う基本単位で格納されるデータを意味します。
もし、組み込み用システムなど、メモリーに制限のある環境でMySQLを利用する場合は、コンピュータが扱う基本単位の1バイトが扱えるtinyintを活用します。
tinyintは真と偽を格納する型を兼ねる
MySQLには、真(True)と偽(False)を格納するためのデータ型、booleanが使えます。そしてこのbooleanは、実際にはtinyintの8ビットの中の1ビットのみを使っています。
なお、MySQLのint型には、括弧内に数字を書くことで、その桁より大きい桁にゼロを入れて、指定した桁しか扱えないようにする機能があるのをご存じでしょうか。つまり、データ型にint(1)を指定すると0から9までしか扱えません。
そして、tinyintで括弧で数字を指定すると、桁ではなく扱えるビットの数を指定できます。具体的には、tinyint(1)は、1ビット、つまり0か1のどちらかを格納するデータ型です。そして、booleanやbitなど、真偽を格納するデータ型は、tinyint(1)のエイリアスであり、実際にはtinyintが使われています。
int(1)とtinyintの違い
小さな数字を扱うのなら、一桁した扱えないint(1)とtinyintは同じようなもの、と思われる方もいるでしょう。しかし、先ほども紹介したようにint(1)は、1桁目よりも大きな桁に0を入れて、1桁しか扱えなくしています。そのため、int(1)は4ビットしか使わないものの、実際には4バイト分の領域を必要とします。その点、tinyintは1バイトの領域しか必要としません。
このようにintは制限したとしても4バイト使ってしまいます。1桁または2桁の数字しか使用しないのであれば、int(2)で制限するのではなく、tinyintを利用しましょう。また、1バイトのtinyintの他に、smallintなら2バイト、mediumintなら3バイトで済むので、扱う数字の大きさに合わせたデータ型を利用しましょう。
tinyint(1)の詳細
先ほど解説したように、整数を扱うデータ型のtinyintですが、tinyint(1)と括弧で1を指定すると1ビット、すなわち真と偽を扱うデータ型です。そして、MySQLには真と偽を扱うboolean型もありますが、これはtinyint(1)と同じものです。そのため、booleanの代わりにtinyint(1)を使っても問題ありません。
boolean型の真と偽の内訳
SQLでboolean型のデータを使った場合、真(True)と偽(False)の2つの値のみ登録できます。そして、MySQLでは、偽の場合は0を、また、真の場合は0以外の数字が割り当てられます。これは、tinyint(0)でも同じです。
tinyint(1)の真と偽
真(True) 0以外の数字
偽(False) 0
なお、レコードを作成した際に、tinyint(1)のデータ型のカラムに何も指定して場合は0が入ります。
実はintでも真と偽を扱える
MySQLで真(True)と偽(False)を扱うには、テーブルを作成する際に、booleanやtinyint(1)を使用しますが、そういったデータ型でなければ扱えない、ということではありません。実は、4バイトの整数であるintでも扱えます。この場合も、偽(False)となるのは0で、それ以外の数は全て真として扱われます。
なお、insert文やupdate文で、偽(False)を登録すると0が、また、真(True)を登録すると1が格納されます。
とはいえ、tinyintを使えば1バイトで済むのに、intを使うと4バイトも使ってしまうのは無駄です。効率良く使えるtinyint、またはbooleanを使いましょう。
整数はintとは限らない
プログラム言語の多くで整数を使う場合、int型の変数を利用しますが、MySQLで整数といえば、サイズに合わせて適切なデータ型を選ぶ必要があります。そのようないくつかある整数のデータ型で、最もサイズの小さなデータ型が、tinyintです。
ただし、整数として使う場合、tinyintは-128から127までと使える範囲が狭く、利用範囲は大きくありません。しかし、最大のbigintが、1つのデータにつき8バイト使ってしまうのに対し、tinyintは1バイトで済むので、大規模なデータを扱う場合、使い方によっては効率的なデータベースを作ることが可能です。ぜひ、tinyintを賢く利用し、効率良く動作するデータベースをシステムに活用しましょう。