数据库中的枚举数据类型探析 (数据库有枚举类型数据)

简介:

在数据库中,我们经常会遇到枚举类型这个概念。枚举类型是一种可以定义固定选项的数据类型,它可以限制一个字段只能填写特定的值。在数据库中,枚举类型被广泛应用于需要固定优选项的地方,比如性别、婚姻状况、教育程度等。本文将从枚举类型的基本概念、定义方法、应用场景、优缺点等方面对其进行详细探析。

一、枚举类型的基本概念

枚举类型是一种定义固定选项的数据类型,通常使用关键字enum来定义。在MySQL等数据库中,枚举类型可以作为表格列定义的一部分,用于限制特定字段的值。枚举类型中的每个值代表了一项枚举值,可以设置值得别名和整数值。枚举类型在程序之间的传递很容易,不需要加入多余的程序代码。

二、枚举类型的定义方法

通常来说,枚举类型的语法比较简单,只需要使用关键字enum即可定义。下面是一个简单的枚举类型定义例子:

enum GenderEnum{ Male, Female }

在这个例子中,我们定义了一个名为GenderEnum的枚举类型,其中又定义了枚举值Male和Female。这样,我们就可以通过这个GenderEnum类型来限制一个数据库表格中个字段只能是Male或Female,其他值不允许出现。

通常来说,枚举类型会有多种“扩展定义”的方式。这些定义方式使得枚举类型更加实用和高效。例如:

1. 命名枚举:

通过给枚举项指定特定的别名来定义枚举类型。这个方法使得程序员可以增加可读性和可维护性。

enum GenderEnum{ Male = 0, Female = 1 }

2. 位域枚举:

通过将枚举值限制在一个位域中来定义枚举类型。即可以将每个可能的枚举值(即枚举项)表示为第2的几次方,一个枚举变量可以表示起多个枚举项。

enum Permissions{ Read=1, Write=2, Exec=4, All=Read|Write|Exec }

大部分情况下,我们只需要定义eunm类型,然后在表格中关联定义的枚举类型即可。例如:

CREATE TABLE student (

id INT NOT NULL AUTO_INCREMENT,

name VARCHAR(50) NOT NULL,

gender GenderEnum NOT NULL,

PRIMARY KEY (`id`)

);

在这个包含了GenderEmum枚举类型的student表格中,gender字段只允许使用GenderEnum类型中定义的两个枚举值。

三、枚举类型的应用场景

枚举类型在数据库中广泛应用,通常用于以下场景:

1. 固定优选项类型字段

枚举类型通常会在数据库中用于固定优选项类型的字段。这包括性别、婚姻状况、教育程度、职业等。它们通常都只允许有固定的值,而且与其他选项互斥。

2. 提高代码可维护性

枚举类型还可以帮助提高代码的可维护性。与常量不同,枚举值会自动赋予可以改为别名的名称。这样可以使得代码更加可读,使得仅从代码本身就能够显式代码的意图。

四、枚举类型的优缺点

枚举类型在使用中也存在一些优缺点。

优点:

1. 枚举类型能够有效地限制数据库中某些项的取值范围,使得它们的使用更加灵活和安全。

2. 枚举类型通常能够提高代码的可维护性,使得代码可以显式地表达出它的意思。

缺点:

1. 枚举类型的设置过程可能没有普通整型字段那么快速和容易,因为需要同时定义每个枚举项。

2. 如果枚举项的总数很多,由于每个枚举项都可以具有命名值,所以会使得文件的体积变大,加载时会对程序增加时间和空间的成本。

五、

枚举类型在数据库中广泛应用。它们是一种极为方便的数据类型,可以限制一个字段输入的值,并且可以节省很多重复代码的编写。尽管枚举类型也存在一些缺点,例如定义和扩展成本的高昂和增加编程负担等,但在正确使用的情况下,枚举类型通常会带来更多的优点。通过熟练地掌握其语法、应用场景和优缺点,我们可以更好地使用枚举类型,并在数据处理过程中充分发挥它们的作用。

相关问题拓展阅读:

sql enum类型

我对MYSQL不是很了解,不过看样子应该是创建表困蠢的语句sex应该是字段名,enum(男女)应蔽尺态该表示字段限定的值只能是男和女,NOT NULL是不为空的意思,default 是返回的意思,结合起来应该是 字段名SEX 限定内容 男和女,字段值不能为空,默认是男的意思。当然以上是我根据宏源大部分编程来猜的。。

enum 是

枚举类型

, sex 尺明性别字段 加约束条件,默认是 ‘男’,插入数据时,sex字段只可以是’镇仔男’或’女’,另外,MySQL 不支持check的陵旅告,虽然语法上不会报错是,分析建表语句的时候会被忽略.

根据用户定义的枚举值与分片节点映射文件,直接定位目标分片。

用户在rule.xml中配置枚举值文件路径和分片索引是字符串还是数字,DBLE在启动时会将枚举值文件加载到内存中,形成一个映射表

在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来,直接查映射表得到分片编号

与MyCat的类似分片算法对比

中间件

DBLE

MyCat

分片算法种类    enum 分区算法    分片枚举    

两种中间件的枚举分片算法使用上无差别。

开发注意点

【分片索引】1. 整型数字(可以为负数)或字符串((不含=和换行符)

【分片索引】2. 枚举值之间不能重复

Male=0Male=1

或者

123=1123=2

会导致分片策略加载出错

【分片索引】3. 不同枚举值可以映射到同一个分片上

Mr=0Mrs=1Miss=1Ms=1123=0

运维注意点

【扩容】1. 增加枚举值无需数据再平衡

【扩容】2. 增加一个枚举值的分片数量数时,需要对局部数据进行迁移

【缩容】1. 减少枚举值需要御氏数据再平衡

【缩容】2. 减少一个枚举值的分片数量数时,需要对局部数据进行迁移

配置注意点

【配置项】1. 在 rule.xml 中,可配置项为  、 和  

【配置项】2. 在 rule.xml 中配置  标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义的范岁兄围时,DBLE 会报错;若需要配置,必须为非负整数,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会路由至这个值的 MySQL 分片

【配置项】3. 在 rule.xml 中配置  标签,范围映射文件的路径:若在映射文件在 DBLE_HOME/conf 或其中,则可以使用相对路径的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_map.txt 时,配置值就可以简写为 map/table_map.txt;映射文件在 DBLE_HOME/conf 目录以外时,需要使用绝对路径,但这种做法需要考虑用户权限等问题,因此不建议把映射文件放在 DBLE_HOME/conf 外。

【配置项】4. 编辑 mapFile 所配置的文件

记录格式为:=

枚举值可以是整型数字,或任意字符(除了=和换行符),分片编号必须是非负整型数字,记录之间以换行分隔,一行仅能有一条记录,枚举值不能够是“DEFAULT_NODE”这个字符串,允许以“//”和“#”在行首来注释该行

【配置项】5. 在 rule.xml 中配置  标签;type 必须为整型;取值为 0 时,mapFile 的必须为整型;取值乎拆袭为非 0 时,mapFile 的可以是任意字符(除了=和换行符)

mysql怎么获取数据表字段enum类型的默认值

enum有优点。但个人觉得。。。缺点更多,客观的讲:优点主要是在建数据 库的时候就可以把一些值给规范好。缺点是。。enum不适合PHP。主要是PHP是弱类型,如:你insert into ….. set a= 1,你没蔽知道你是想 a= ‘1’者桐扮 还是 a= 1(a=’1’是插入值1,a=1是插入enum的之一个值,尤其php弱类型的,首灶如果int的,很少有人在sql里加双引号。),这是PHP和mysql 在使用enum 更大的问题。所以。。安心点啦。干脆点直接tinyin

mysql怎么获取数据表字段enum类型的默认值

本节主要内容:

MySQL数据类型之枚举类型ENUM

MySQL数据库提供针对字符串存储的一种特殊数据类型:枚举类型ENUM,这种喊野数据类型可以给予我们更多提高性能、降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别介绍了布尔类型BOOL或称布尔类型乱渗者BOOLEAN,以及后续会再单独介绍类型SET。

本文详细介绍类型enum测试过程与总结,加深对mysql数据库类型enum的理解记忆。

n 枚举类型ENUM

a).数据库表mysqlops_enum结构

执行数据库表mysqlops_enum创建的SQL语句:

复制代码代码示例:

root@localhost : test 11:22:29> CREATE TABLE Mysqlops_enum(ID INT NOT NULL AUTO_INCREMENT,

-> Job_type ENUM(‘DBA’,’SA’,’Coding Engineer’,’JavaScript’,’NA’,’QA’,”,’other’) NOT NULL,

-> Work_City ENUM(‘shanghai’,’beijing’,’hangzhou’,’shenzhen’,’guangzhou’,’other’) NOT NULL DEFAULT ‘shanghai’,

-> PRIMARY KEY(ID)

-> )ENGINE=InnoDB CHARACTER SET ‘utf8’ COLLATE ‘utf8_general_ci’;

Query OK, 0 rows affected (0.00 sec)

执行查询数据库表mysqlops_enum结构的SQL语句:

复制代码代码示例:

root@localhost : test 11:23:31> SHOW CREATE TABLE Mysqlops_enum\G

*************************** 1. row ***************************

Table: Mysqlops_enum

Create Table: CREATE TABLE `Mysqlops_enum` (

`ID` int(11) NOT NULL AUTO_INCREMENT,

`Job_type` enum(‘DBA’,’SA’,’Coding Engineer’,’JavaScript’,’NA’,’QA’,”,’other’) NOT NULL,

`Work_City` enum(‘shanghai’,’beijing’,’hangzhou’,’shenzhen’,’guangzhou’,’other’) NOT NULL DEFAULT ‘shanghai’,

PRIMARY KEY (`ID`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

小结:

为方便测试枚举类型,如何处理字段定义的默认值、是否允许为NULL和空值的情况,我们定义了2个枚举类型的字段名,经过对比创建与查询数据库中表的结构信息,没有发现MySQL数据库默认修改任何信息。

b). 写入不同类型的测试数据

写入一条符合枚举类型定义的记录值:

复制代码代码示例:

root@localhost : test 11:22:35> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(1,’QA’,’shanghai’);

Query OK, 1 row affected (0.00 sec)

测试第二个枚举类型字Work_City是否允许为空记录值:哗薯

复制代码代码示例:

root@localhost : test 11:22:42> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(2,’NA’,”);

Query OK, 1 row affected, 1 warning (0.00 sec)

root@localhost : test 11:22:48> SHOW WARNINGS;

++——+——+

| Level | Code | Message|

++——+——+

| Warning | 1265 | Data truncated for column ‘Work_City’ at row 1 |

++——+——+

1 row in set (0.00 sec)

测试第二个枚举类型字段Work_City是否允许存储NULL值:

复制代码代码示例:

root@localhost : test 11:22:53> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(3,’Other’,NULL);

ERROR 1048 (23000): Column ‘Work_City’ cannot be null

测试之一个枚举类型字段Job_type是否可以存储空白值:

复制代码代码示例:

root@localhost : test 11:22:59> INSERT INTO Mysqlops_enum(ID,Job_type,Work_City) VALUES(4,”,’hangzhou’);

Query OK, 1 row affected (0.00 sec)

测试第二个枚举类型字段Job_City如何处理没有在定义中描述的值域之一个枚举类型字段Work_Type的默认值没指定情况下,会默认填写那个值:

复制代码代码示例:

root@localhost : test 11:23:06> INSERT INTO Mysqlops_enum(ID,Work_City) VALUES(5,’ningbo’);

Query OK, 1 row affected, 1 warning (0.00 sec)

root@localhost : test 11:23:13> SHOW WARNINGS;

++——+——+

| Level | Code | Message|

++——+——+

| Warning | 1265 | Data truncated for column ‘Work_City’ at row 1 |

++——+——+

1 row in set (0.00 sec)

测试第二个枚举类型字段未插入数据的情况下,是否能使用上字段定义中指定的默认值:

复制代码代码示例:

root@localhost : test 11:23:17> INSERT INTO Mysqlops_enum(ID,Job_type) VALUES(6,’DBA’);

Query OK, 1 row affected (0.00 sec)

根据用户定义的枚举值与分片节点映射文件,直接定位目标分片。

用户在rule.xml中配置枚举值文件路径和分片索引是字符串还是数字,DBLE在启动时会将枚举值文件加载到内存中,形成一个映射表

在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来,直接查映射表得到分片编号

与MyCat的类似分片算法对比

中间件

DBLE

MyCat

分片算法种类    enum 分区算法    分片枚举    

两种中间件的枚举分片算法使用上无差别。

开发注意点

【分片索引】1. 整型数字(可以为负数)或字符串((不含=和换行符)

【分片索引】2. 枚举值之间不能重复

Male=0Male=1

或者

123=1123=2

会导致分片策略加载出错

【分片索引】3. 不同枚举值可以映射到同一个分片上

Mr=0Mrs=1Miss=1Ms=1123=0

运维注意点

【扩容】1. 增加枚举值无需数据再平衡

【扩容】2. 增加一个枚举值的分片数量数时,需要对局部数据进行迁移

【缩容】1. 减少枚举值需要御氏数据再平衡

【缩容】2. 减少一个枚举值的分片数量数时,需要对局部数据进行迁移

配置注意点

【配置项】1. 在 rule.xml 中,可配置项为  、 和  

【配置项】2. 在 rule.xml 中配置  标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义的范岁兄围时,DBLE 会报错;若需要配置,必须为非负整数,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会路由至这个值的 MySQL 分片

【配置项】3. 在 rule.xml 中配置  标签,范围映射文件的路径:若在映射文件在 DBLE_HOME/conf 或其中,则可以使用相对路径的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_map.txt 时,配置值就可以简写为 map/table_map.txt;映射文件在 DBLE_HOME/conf 目录以外时,需要使用绝对路径,但这种做法需要考虑用户权限等问题,因此不建议把映射文件放在 DBLE_HOME/conf 外。

【配置项】4. 编辑 mapFile 所配置的文件

记录格式为:=

枚举值可以是整型数字,或任意字符(除了=和换行符),分片编号必须是非负整型数字,记录之间以换行分隔,一行仅能有一条记录,枚举值不能够是“DEFAULT_NODE”这个字符串,允许以“//”和“#”在行首来注释该行

【配置项】5. 在 rule.xml 中配置  标签;type 必须为整型;取值为 0 时,mapFile 的必须为整型;取值乎拆袭为非 0 时,mapFile 的可以是任意字符(除了=和换行符)

数据库有枚举类型数据的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库有枚举类型数据,数据库中的枚举数据类型探析,sql enum类型,mysql怎么获取数据表字段enum类型的默认值的信息别忘了在本站进行查找喔。


数据运维技术 » 数据库中的枚举数据类型探析 (数据库有枚举类型数据)