MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのTINYINT(1)は127までの値を保持できる?表示幅と格納範囲の違いを解説

MySQLでブール値の代わりによく使われる「TINYINT(1)」。しかし、この「(1)」という数字は格納できる値の範囲を制限するものではありません。本記事では、TINYINT型の仕組みと、TINYINT(1)でも127や-128といった値が保持できる理由を、実際のSQL実行例とともにわかりやすく解説します。

TINYINT型の基本仕様

まず、MySQLにおけるTINYINT型のポイントを整理しましょう。

  • データサイズ: TINYINT型は1バイト(8ビット)で構成されます。
  • 表示幅: TINYINT(N) の「N」は、あくまで表示幅(桁数の見た目)を指定するものであり、格納できる値の範囲には影響しません。

例えば、TINYINT(1) の「1」は表示幅が1桁であることを示すだけで、保存可能な数値そのものを制限するわけではありません。

TINYINTの最小値と最大値

符号付きTINYINTの取り得る値の範囲は、次のように計算できます。

最大値 = (2^(8-1) - 1) = 127
最小値 = -(2^(8-1))    = -128

つまり、TINYINTに格納できる値は -128 ~ 127 の範囲です。このことからも分かるように、TINYINT(1) を指定しても最大値・最小値は変わりません

実際に検証してみよう

それでは、実際にSQLを実行して挙動を確認します。

1. テーブルを作成する

まず、TINYINT(1) 型のカラムを持つテーブルを作成します。

mysql> create table Display
   -> (
   -> rangeOfId tinyint(1)
   -> );
Query OK, 0 rows affected (0.67 sec)

2. 範囲外の値を挿入するとエラーになる

次に、最大値127を超える「128」を挿入してみます。すると、範囲外エラーが発生します。

mysql> insert into Display values(128);
ERROR 1264 (22003): Out of range value for column 'rangeOfId' at row 1

このように、TINYINT(1) であっても格納範囲は -128~127 のままなので、128は登録できません。

3. 範囲内の値を挿入する

続いて、範囲内である「127」と「-128」を挿入します。今度は正常に登録できます。

mysql> insert into Display values(127);
Query OK, 1 row affected (0.18 sec)

mysql> insert into Display values(-128);
Query OK, 1 row affected (0.20 sec)

4. 登録結果を確認する

SELECT文で全レコードを表示して確認しましょう。

mysql> select * from Display;

出力結果

+-----------+
| rangeOfId |
+-----------+
|       127 |
|      -128 |
+-----------+
2 rows in set (0.00 sec)

まとめ:TINYINT(1)とブール値の扱いについて

この検証結果から、以下のことが確認できました。

  • TINYINT(1) の「1」は表示幅の指定であり、格納できる値の範囲は変わらない。
  • 符号付きTINYINTの範囲は -128 ~ 127 であり、これを超える値はエラーになる。
  • したがって、TINYINT(1) でも 127 や -128 といった値は問題なく保持できる

なお、多くのアプリケーションやコネクタ(JDBCなど)では、TINYINT(1) をブール型(true/false)として扱う慣習があります。フラグ管理には便利ですが、0/1以外の数値を格納したい場合は、意図しない挙動を避けるためにもTINYINT(4) などを明示的に指定することをおすすめします。また、MySQL 8.0.17以降では整数型の表示幅指定自体が非推奨となっている点にも注意が必要です。

  1. PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方

    本記事では、MySQL 8.0.12を使用して、ブール(Boolean)値の正しい取り扱い方を解説します。まず、使用しているMySQLのバージョンを確認しておきましょう。 mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec) MySQLにおけるブール値の基本:BOOL・BOOLEAN・TINYINT(1) MySQLでブール値を扱うには、BOOL、BOOLEAN、またはTINYINT(1)のいずれかを使用

  2. Javaを使用してMySQLテーブルの値を表示する方法

    MySQLデータベースのテーブル値をJavaで表示するには、ResultSetの概念を利用します。データベースへの接続には、MySQL JDBCドライバーを使用します。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table demo87    -> (    -> name varchar(20),    -> age int    -> )