如何证明每个MySQL枚举都有一个索引值?
实际上,ENUM 列规范中列出的元素被分配了从 1 开始的索引号。这里“索引”一词指的是枚举值列表中的位置,与表索引无关。通过以下示例,我们可以证明每个 MySQL 枚举都有一个索引值:
通过插入索引号代替枚举值
我们可以使用索引号而不是编写值来在 ENUM 列中插入值。例如,在下表中,我们有两个 ENUM 值“pass”和“fail”。由于“pass”在枚举列表中首先出现,因此获得了索引号“1”,而“fail”则为“2”。现在我们也可以通过插入索引号来插入值,如下所示:
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)
在上面的查询中,我们分别使用了索引号 1 和 2 来表示枚举值 pass 和 fail。
通过插入空字符串代替枚举值
空字符串的索引值为 0。在插入空字符串之前,SQL 模式必须不是 TRADITIONAL、STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES。通过以下示例,我们可以理解它:
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)
上面的查询将在枚举值的位置插入空字符串。MySQL 会在插入空字符串时显示以下警告。
mysql> Show warnings; +---------+------+---------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------+ | Warning | 1265 | Data truncated for column 'Result' at row 1 | +---------+------+---------------------------------------------+ 1 row in set (0.00 sec)
现在,当我们检查表时,可以看到 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) From the output of above query, it is clear that the index value of the empty string is 0.
通过插入 NULL 代替枚举值
我们可以在枚举值的位置插入 NULL,因为我们没有为 ENUM 列指定 NOT NULL。NULL 的索引值为 NULL。例如,通过以下查询,我们在表“result”的枚举列中插入 NULL,并可以检查其索引值。
mysql> Create table result(Id INT PRIMARY KEY NOT NULL, Name Varchar(10), GradeENUM('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)
上面的查询在枚举值的位置插入了值 NULL,可以使用下面的查询进行检查:
mysql> Select * from result; +-----+-------+-------+ | Id | Name | Grade | +-----+-------+-------+ | 100 | Rahul | NULL | +-----+-------+-------+ 1 row in set (0.00 sec)
现在,通过下一个查询,我们可以观察到 NULL 的索引值为 NULL。
mysql> Select Grade+0 As Grade_index from result; +-------------+ | Grade_index | +-------------+ | NULL | +-------------+ 1 row in set (0.00 sec)
广告