教程集 www.jiaochengji.com
教程集 >  数据库  >  mysql  >  正文 MySQL数据类型之集合类型和枚举类型的用法

MySQL数据类型之集合类型和枚举类型的用法

发布时间:2016-01-19   编辑:jiaochengji.com
本文详细介绍了mysql数据库的两种数据类型,集合类型和枚举类型的用法,有兴趣的朋友参考研究下吧。

针对四种数据类型:布尔类型BOOL或称布尔类型BOOLEAN、微整型TINYTINT、枚举类型ENUM、集合类型SET,已给出了详细的介绍与功能测试数据。

本文将深入介绍枚举类型EUNM和集合类型SET。测试基于InnoDB存储引擎上,对MySQL数据库集合类型SET和枚举类型ENUM的字段进行DDL变更操作,是否需要重新创建表呢?对数据库的事务处理有何影响?对数据库的数据服务提供有何性能影响?

(一)   系统环境
硬件:DELL R510  10块盘做的RAID5,上面跑了几十台虚拟机
操作系统:CentOS release 5.5 (Final)
MySQL数据库:5.5.15-log
InnoDB存储引擎:plugin-InnoDB 1.1.8

(二)   测试数据准备
1>.创建表结构的SQL命令
 

复制代码 代码示例:
CREATE DATABASE mysqlops CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
 
USE mysqlops;
 
CREATE TABLE `mysqlops_set_enum_bk` (
 
  `ID` INT  NOT NULL AUTO_INCREMENT,
 
  `Work_Option` set('JavaScript','DBA','SA','C++','NA','QA','Java','PHP','','Python'),
 
  `Work_City` set('shanghai','beijing','hangzhou','shenzhen','guangzhou','xiamen','tianjin','qingdao','dalian','xian','other') NOT NULL DEFAULT 'shanghai',
 
  PRIMARY KEY (`ID`)
 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 

2>.用于分隔字符串的函数代码
 

复制代码 代码示例:
USE mysqlops;
 
DELIMITER $$
 
DROP FUNCTION IF EXISTS fun_split $$
 
CREATE FUNCTION fun_split(strValue VARCHAR(500),strSplit CHAR(1),iPostion TINYINT)
 
RETURNS VARCHAR(20) DETERMINISTIC
 
BEGIN
 
DECLARE strValue_New VARCHAR(500) DEFAULT '';
 
DECLARE strValue_Old VARCHAR(500) DEFAULT '';
 
DECLARE strReturn VARCHAR(20) DEFAULT '';
 
DECLARE iLength_Old TINYINT DEFAULT 0;
 
DECLARE iLength_New TINYINT DEFAULT 0;
 
DECLARE iLength TINYINT DEFAULT 0;
 
SET strValue_New=SUBSTRING_INDEX(strValue,strSplit,iPostion);
 
IF iPostion-1<>0 THEN
 
SET strValue_Old=SUBSTRING_INDEX(strValue,strSplit,iPostion-1);
 
SET iLength_Old=LENGTH(strValue_Old);
 
ELSE
 
SET iLength_Old=-1;
 
END IF;
 
SET iLength_New=LENGTH(strValue_New);
 
SET iLength=iLength_New-iLength_Old;
 
SET strReturn=SUBSTRING(strValue_new,iLength_Old+2,iLength);
 
RETURN strReturn;
 
END $$
 
DELIMITER ;
 

3>.用于生成测试数据的存储过程代码
 

复制代码 代码示例:
USE mysqlops;
 
DELIMITER $$
 
DROP PROCEDURE IF EXISTS `usp_mysqlops_set_enum` $$
 
CREATE PROCEDURE usp_mysqlops_set_enum(strenum_job VARCHAR(500),strset_city VARCHAR(500),idata_total INT)
 
BEGIN
 
DECLARE isplit_num TINYINT DEFAULT 0;
 
DECLARE idata_num  INT DEFAULT 0;
 
DECLARE iwhile_num INT DEFAULT 0;
 
DECLARE icommit    SMALLINT DEFAULT 0;
 
DECLARE irnd_f     TINYINT DEFAULT 0;
 
DECLARE irnd_s     TINYINT DEFAULT 0;
 
DECLARE strenum_job_sub VARCHAR(20) DEFAULT '';
 
SET isplit_num=LENGTH(strenum_job)-LENGTH(REPLACE(strenum_job,',',''));
 
SET idata_num=FLOOR(idata_total/isplit_num);
 
WHILE isplit_num<>0
 
DO
 
SET strenum_job_sub=fun_split(strenum_job,',',isplit_num);
 
WHILE iwhile_num<idata_num
 
DO
 
IF icommit=0 THEN
 
START TRANSACTION;
 
END iF;
 
SET irnd_f=SUBSTRING(RAND(),3,1);
 
SET irnd_s=SUBSTRING(RAND(),3,1);
 
INSERT INTO mysqlops_set_enum(Work_Option,Work_City)
 
VALUES(strenum_job_sub,CONCAT(fun_split(strset_city,',',irnd_f),',',fun_split(strset_city,',',irnd_s)));
 
IF icommit=10000 THEN
 
SET icommit=0;
 
COMMIT;
 
END IF;
 
SET icommit=icommit+1;
 
SET iwhile_num=iwhile_num+1;
 
END WHILE;
 
SET iwhile_num=0;
 
SET isplit_num=isplit_num-1;
 
END WHILE;
 
END $$
 
DELIMITER ;

4>.生成测试数据
传入三个收入参数:枚举类型ENUM字段的值、集合类型SET字段的值、目标生成测试数据的总条数2000W,命令如下:
 

复制代码 代码示例:
USE mysqlops;
 
CALL usp_mysqlops_set_enum('DBA,SA,C++,JavaScript,NA,QA,Java,PHP,other,,Python','shanghai,beijing,hangzhou,shenzhen,guangzhou,xiamen,tianjin,qingdao,dalian,xian,other',20000000);
 

(三)   总结
本文主要是为接下来的二篇主题分别为:MySQL数据库之集合数据类型SET的DDL变更测试、MySQL数据库之枚举数据类型ENUM的DDL变更测试,而准备测试环境的文章信息,且这二篇文章都是用共同的测试表数据,也为方便读者们的理解与后续篇章的阅读,特意单独作为一篇文章,本文的主要内容是MySQL函数与MySQL存储过程,可以借鉴到的信息:
a)、提供一个较通用性的字符串分拆函数,也即指定分隔符号,再传入字符串和分拆字符的顺序号,即返回想获得的字符串数据;
b)、MySQL函数的正确编写技巧;
c)、MySQL存储过程的编写技巧;
d)、MySQL提供的语句段控制循环操作的WHILE用法;
e)、MySQL函数与MySQL存储过程内,都有各种字符串函数的调用,也请读者学习其用法;
f)、 MySQL存储过程中采用了多条语句写入,批量提交的事务技巧,以加速InnoDB存储引擎INSERT事务的处理速度;

您可能感兴趣的文章:
详解MySQL数据类型之枚举类型ENUM的用法
MySQL数据类型之集合类型和枚举类型的用法
C语言枚举类型学习笔记
PHP 枚举类型的管理与设计
C# 枚举类型转换字符串 Enum to string
详解MySQL数据库的集合类型SET的DDL变更方法
Django之modles.py创建表
.net 泛型 局部类型、属性访问器保护级别、命名空间别名限定符
什么是枚举python
Python3枚举类比较有什么限制?

[关闭]
~ ~