MySQLのデータ型選択:ENUMとTINYINT UNSIGNEDの違いと使い分け
はじめに
MySQLで数値を格納するカラムを設計する際、「取りうる値があらかじめ決まっているかどうか」によって、最適なデータ型は変わってきます。この記事では、ENUM型とTINYINT UNSIGNED型の特徴と使い分けを、実際のSQL例とともに解説します。
基本的な使い分けの考え方
- 格納できる値があらかじめ限定されている場合 → ENUM型が最適です。ENUMは制約が厳しく、定義された値以外の登録を防ぐことができます。
- 取りうる値が不明・可変の場合 → TINYINT UNSIGNED型を使用しましょう。制約が緩やかで、柔軟な値の登録が可能です。
ENUM型の実装例
ここでは、10、20、30 の3つの値のみを保存したいケースを想定します。まずテーブルを作成してみましょう。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Number ENUM('10','20','30')
);
Query OK, 0 rows affected (0.24 sec)
次に、INSERTコマンドでレコードを挿入します。
mysql> insert into DemoTable(Number) values('10');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(Number) values('20');
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable(Number) values('30');
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable(Number) values('50');
ERROR 1265 (01000): Data truncated for column 'Number' at row 1
注目すべき点は、定義されていない値「50」を挿入しようとしたところ、エラー(Data truncated)が発生して登録が拒否されたことです。これがENUM型のもつ厳格な制約機能です。
SELECT文で全レコードを確認してみます。
mysql> select * from DemoTable;
実行結果は以下の通りです。
+----+--------+
| Id | Number |
+----+--------+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
+----+--------+
3 rows in set (0.00 sec)
許可された3つの値だけが正しく保存されていることがわかります。
TINYINT UNSIGNED型の実装例
続いて、TINYINT UNSIGNED型を使った場合を見てみましょう。新しいテーブルを作成します。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Number tinyint unsigned
);
Query OK, 0 rows affected (0.23 sec)
同じようにレコードを挿入します。今回は任意の数値を自由に登録できます。
mysql> insert into DemoTable(Number) values(100);
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(Number) values(50);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Number) values(60);
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable(Number) values(70);
Query OK, 1 row affected (0.07 sec)
SELECT文で確認してみましょう。
mysql> select * from DemoTable;
実行結果は以下の通りです。
+----+--------+
| Id | Number |
+----+--------+
| 1 | 100 |
| 2 | 50 |
| 3 | 60 |
| 4 | 70 |
+----+--------+
4 rows in set (0.00 sec)
すべての値が問題なく登録されました。TINYINT UNSIGNEDは0〜255の範囲内であれば、どのような数値でも受け入れる柔軟性があります。
まとめ
| データ型 | 特徴 | 適した場面 |
|---|---|---|
| ENUM | 定義済みの値のみ許可(厳格な制約) | 値の種類が固定されている場合 |
| TINYINT UNSIGNED | 0〜255の数値を柔軟に受け入れ | 値が不明または将来的に増える可能性がある場合 |
このように、データの性質に応じて適切なデータ型を選択することが、堅牢で保守しやすいデータベース設計の鍵となります。値の種類が確定しているならENUMで整合性を担保し、不確実ならTINYINT UNSIGNEDで柔軟性を持たせる、という判断基準を覚えておきましょう。
-
SQL ServerにMySQLのENUM型に相当する機能はある?代替方法を解説
結論から言うと、SQL ServerにはMySQLのENUMデータ型と完全に同じ組み込みデータ型は存在しません。しかし、VARCHAR型とCHECK制約を組み合わせることで、ENUMとほぼ同等の機能を実現できます。MySQLにおけるENUM型の基本まず、MySQL(バージョン8.0.12で動作確認済み)でのENUM型の定義方法を見てみましょう。構文は以下の通りです。create table yourTableName ( yourColumnName enum(Value1,Value2,Value3,......N) default Value1 or Value2 or Value3,..
-
C++でデータ型の範囲を計算する方法
はじめにC++には、int、char、doubleなど、さまざまなデータ型が用意されています。本記事では、これらのデータ型のサイズと、表現できる値の範囲をプログラムで求める方法を解説します。データ型の範囲を求める仕組みデータ型のサイズはバイト単位で取得できるため、8を掛ければビット数に変換できます。ビット数をnとすると、符号付き整数の場合、最小値は「-2^(n-1)」、最大値は「2^(n-1) - 1」となります。一方、符号なし整数には負の数が存在しないため、範囲は「0」から「2^n - 1」までです。サンプルコード#include <iostream> #include <