Thực tế, các phần tử được liệt kê trong đặc tả cột ENUM được gán các số chỉ mục bắt đầu từ 1. Thuật ngữ "chỉ mục" ở đây chỉ vị trí trong danh sách các giá trị liệt kê, không liên quan đến chỉ mục bảng. Với các ví dụ sau, chúng ta có thể chứng minh rằng mỗi giá trị ENUM trong MySQL có một giá trị chỉ mục:
1. Bằng cách chèn số chỉ mục thay vì giá trị liệt kê
Chúng ta có thể chèn giá trị vào cột ENUM bằng số chỉ mục của chúng thay vì viết giá trị. Ví dụ, trong bảng dưới đây có hai giá trị ENUM là 'pass' và 'fail'. Vì 'pass' được viết đầu tiên trong danh sách liệt kê nên có chỉ mục '1', và 'fail' có chỉ mục '2'. Bây giờ chúng ta cũng có thể chèn giá trị bằng cách chèn số chỉ mục như sau:
mysql> INSERT INTO marks(id, name, result) VALUES (103, 'Daksh', '1'); Query OK, 1 row affected (0.06 sec) mysql> INSERT INTO marks(id, name, result) VALUES (104, 'Shayra', '2'); Query OK, 1 row affected (0.07 sec) mysql> SELECT * FROM marks; +-----+---------+--------+ | id | Name | Result | +-----+---------+--------+ | 101 | Aarav | Pass | | 102 | Yashraj | Fail | | 103 | Daksh | Pass | | 104 | Shayra | Fail | +-----+---------+--------+ 4 rows in set (0.00 sec)
Trong các truy vấn trên, chúng ta đã sử dụng số chỉ mục 1 và 2 cho các giá trị liệt kê pass và fail tương ứng.
2. Bằng cách chèn chuỗi rỗng thay vì giá trị liệt kê
Giá trị chỉ mục của chuỗi rỗng là 0. Trước khi chèn chuỗi rỗng, chế độ SQL không được là TRADITIONAL, STRICT_TRANS_TABLES hoặc STRICT_ALL_TABLES. Với ví dụ sau, chúng ta có thể hiểu:
mysql> SET SESSION sql_mode = ''; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO marks(id, name, result) VALUES (105, 'Yashraj', ''); Query OK, 1 row affected, 1 warning (0.06 sec)
Truy vấn trên sẽ chèn chuỗi rỗng vào vị trí giá trị liệt kê. MySQL chèn chuỗi rỗng với cảnh báo sau:
mysql> SHOW WARNINGS; +---------+------+---------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------+ | Warning | 1265 | Data truncated for column 'Result' at row 1 | +---------+------+---------------------------------------------+ 1 row in set (0.00 sec)
Khi kiểm tra bảng, chúng ta thấy chuỗi rỗng trong trường ENUM:
mysql> SELECT * FROM marks; +-----+---------+--------+ | id | Name | Result | +-----+---------+--------+ | 101 | Aarav | Pass | | 102 | Yashraj | Fail | | 103 | Daksh | Pass | | 104 | Shayra | Fail | | 105 | Yash | | +-----+---------+--------+ 5 rows in set (0.00 sec) mysql> SELECT result+0 AS result_index FROM marks; +--------------+ | result_index | +--------------+ | 1 | | 2 | | 1 | | 2 | | 0 | +--------------+ 5 rows in set (0.01 sec)
Từ kết quả truy vấn trên, rõ ràng giá trị chỉ mục của chuỗi rỗng là 0.
3. Bằng cách chèn NULL thay vì giá trị liệt kê
Chúng ta có thể chèn NULL vào vị trí giá trị liệt kê vì chúng ta không chỉ định NOT NULL với cột ENUM. Giá trị chỉ mục của NULL là NULL. Ví dụ, với truy vấn sau, chúng ta chèn NULL vào cột liệt kê của bảng 'result' và kiểm tra giá trị chỉ mục của nó:
mysql> CREATE TABLE result(Id INT PRIMARY KEY NOT NULL, Name VARCHAR(10), Grade ENUM('POOR', 'GOOD'));
Query OK, 0 rows affected (0.25 sec)
mysql> INSERT INTO result(id, name, grade) VALUES (100, 'Rahul', NULL);
Query OK, 1 row affected (0.06 sec)
Truy vấn trên chèn giá trị NULL vào vị trí giá trị liệt kê, có thể kiểm tra bằng truy vấn dưới đây:
mysql> SELECT * FROM result; +-----+-------+-------+ | Id | Name | Grade | +-----+-------+-------+ | 100 | Rahul | NULL | +-----+-------+-------+ 1 row in set (0.00 sec)
Bây giờ, với truy vấn tiếp theo, chúng ta quan sát được rằng giá trị chỉ mục của NULL là NULL:
mysql> SELECT Grade+0 AS Grade_index FROM result; +-------------+ | Grade_index | +-------------+ | NULL | +-------------+ 1 row in set (0.00 sec)