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

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 UNSIGNED0〜255の数値を柔軟に受け入れ値が不明または将来的に増える可能性がある場合

このように、データの性質に応じて適切なデータ型を選択することが、堅牢で保守しやすいデータベース設計の鍵となります。値の種類が確定しているならENUMで整合性を担保し、不確実ならTINYINT UNSIGNEDで柔軟性を持たせる、という判断基準を覚えておきましょう。

  1. 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,..

  2. C++でデータ型の範囲を計算する方法

    はじめにC++には、int、char、doubleなど、さまざまなデータ型が用意されています。本記事では、これらのデータ型のサイズと、表現できる値の範囲をプログラムで求める方法を解説します。データ型の範囲を求める仕組みデータ型のサイズはバイト単位で取得できるため、8を掛ければビット数に変換できます。ビット数をnとすると、符号付き整数の場合、最小値は「-2^(n-1)」、最大値は「2^(n-1) - 1」となります。一方、符号なし整数には負の数が存在しないため、範囲は「0」から「2^n - 1」までです。サンプルコード#include <iostream> #include <