Rohit Gupta Asked: 2025-01-21 21:22:01 +0800 CST2025-01-21 21:22:01 +0800 CST 2025-01-21 21:22:01 +0800 CST 枚举如何在 MariaDB 中存储 772 我创建了一个数据库,其中表的一个字段定义为enum('M', 'B')。我使用的工具将其转换为变体类型。我想覆盖它并将其视为字符。那么问题是,它是否作为字符存储在数据库中? mariadb 2 个回答 Voted Best Answer Ergest Basha 2025-01-21T22:07:42+08:002025-01-21T22:07:42+08:00 ENUM 值在内部表示为整数,其中每个枚举值由从 1 开始的整数索引表示。如果该值与任何定义的 ENUM 值不匹配,则将其存储为 0。 考虑以下示例, CREATE TABLE myTable ( id INT NOT NULL auto_increment PRIMARY KEY, myCol enum('M', 'B') ); INSERT INTO myTable (myCol) VALUES ('M'), ('B'); 以下查询将得到相同的结果 SELECT * FROM myTable WHERE myCol='B'; SELECT * FROM myTable WHERE myCol=2; 结果 id myCol 2 B 如果在数字上下文中使用 ENUM,MariaDB 会将其视为整数: SELECT id, myCol+0 FROM myTable; 结果 id myCol+0 1 1 2 2 查看示例 详细解释请参见ENUM 编辑 “如果该值与任何定义的 ENUM 值不匹配,则将其存储为 0。不成立” 如果未启用严格 SQL 模式,我们将插入一个无效值,例如3在我们的例子中。 现在如果我跑步, 从 myTable 中选择 m.*,其中 myCol = 0; 结果是 id myCol 3 为了验证myColID 3 的值是如何存储的,我们使用 SELECT id, myCol + 0 FROM myTable; 这将导致 id myCol + 0 1 1 2 2 3 0 ----> Note `0` 查看示例 Rick James 2025-01-22T02:12:59+08:002025-01-22T02:12:59+08:00 Ergest 有一个很好的答案;这里我做一点补充: 如果选项数量最多为 255 个,ENUM则占用 1 个字节;如果选项数量较多(最多为 64K),则占用 2 个字节。 拥有多个选项是不切实际的,因为您可能永远都无法ALTER TABLE添加新的选项。 请注意,枚举选项的顺序对于发现底层数值和排序至关重要。使用 Ergest 的示例,“M”<“B”,因为“M”位于“B”之前(因此实现编号较低)。这与每个排序规则中的“M”>“B”不同。
ENUM 值在内部表示为整数,其中每个枚举值由从 1 开始的整数索引表示。如果该值与任何定义的 ENUM 值不匹配,则将其存储为 0。
考虑以下示例,
以下查询将得到相同的结果
结果
如果在数字上下文中使用 ENUM,MariaDB 会将其视为整数:
结果
查看示例
详细解释请参见ENUM
编辑
如果未启用严格 SQL 模式,我们将插入一个无效值,例如
3
在我们的例子中。现在如果我跑步,
从 myTable 中选择 m.*,其中 myCol = 0;
结果是
为了验证
myCol
ID 3 的值是如何存储的,我们使用这将导致
查看示例
Ergest 有一个很好的答案;这里我做一点补充:
如果选项数量最多为 255 个,
ENUM
则占用 1 个字节;如果选项数量较多(最多为 64K),则占用 2 个字节。拥有多个选项是不切实际的,因为您可能永远都无法
ALTER TABLE
添加新的选项。请注意,枚举选项的顺序对于发现底层数值和排序至关重要。使用 Ergest 的示例,“M”<“B”,因为“M”位于“B”之前(因此实现编号较低)。这与每个排序规则中的“M”>“B”不同。