MySQLのENUM値はどのようにソートされるのか?その仕組みと実例を解説
MySQLでは、ENUM型の各値にはそれぞれインデックス番号が関連付けられています。ENUM値のソートは、このインデックス番号を基準に行われるのが特徴です。そして、インデックス番号はカラム定義時に列挙メンバーを記述した順序によって決まります。
例えば、ENUM('GOOD', 'EXCELLENT') というカラムを定義した場合、「GOOD」は「EXCELLENT」よりも先にソートされます。言い換えると、「GOOD」のインデックス番号は「1」、「EXCELLENT」のインデックス番号は「2」となり、数値の昇順で並べ替えられる仕組みです。
NULL値と空文字列のソート順
MySQLのENUM型は、空文字列('')やNULL値を格納することもできます。これらが混在する場合のソート順は以下のとおりです。
- NULL … 最も先頭に来る
- 空文字列 … NULLの次
- 非空文字列(通常のENUM値) … インデックス番号順
つまり、ソート順は「NULL → 空文字列 → 通常の値」という優先順位になります。
実例:ENUMカラムを持つテーブルでのソート
ここでは、ENUM型カラム「grade」を持つテーブル「result」を例に見てみましょう。テーブルには以下のデータが格納されています。
mysql> Select * from Result; +-----+--------+-------+ | Id | Name | Grade | +-----+--------+-------+ | 100 | Gaurav | GOOD | | 101 | Rahul | POOR | | 102 | Rahul | NULL | | 103 | Mohan | | +-----+--------+-------+ 4 rows in set (0.00 sec)
ORDER BY句によるソート結果
ORDER BY 句を使用してgradeカラムでソートすると、MySQLは次のような結果を返します。
mysql> Select * from result order by grade; +-----+--------+-------+ | Id | Name | Grade | +-----+--------+-------+ | 102 | Rahul | NULL | | 103 | Mohan | | | 101 | Rahul | POOR | | 100 | Gaurav | GOOD | +-----+--------+-------+ 4 rows in set (0.00 sec)
この出力結果から、レコードが文字列のアルファベット順ではなく、ENUM定義時のインデックス番号に基づいてソートされていることが確認できます。NULLが最初、次に空文字列、その後に定義順に従った値(POOR → GOOD)が続いています。
まとめ
ENUM型のソートは文字列比較ではなくインデックス番号に基づくため、カラム定義時にメンバーを記述する順序が非常に重要です。意図しない表示順になる場合は、まずENUMの定義順を見直すことで解決できることが多いでしょう。
-
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)のいずれかを使用
-
MySQLで列にENUM型を設定する方法
```html MySQLでは、テーブルを作成する際に、あらかじめ決められた文字列のリストから値を選ばせたい列に対してENUM型を設定できます。ENUMは、指定した候補値以外のデータが登録されるのを防ぎたい場合に便利なデータ型です。ここでは、実際にテーブルを作成しながら基本的な使い方を見ていきましょう。ENUM型を含むテーブルを作成するまず、学生の点数と合否ステータスを管理するテーブルを作成します。「StudentStatus」列には「First」「Second」「Fail」の3つの値のみを許可するENUM型を設定しています。mysql> create table DemoTable20