文档章节

MySQL函数和存储过程生成电话号码

trayvon
 trayvon
发布于 2015/11/09 16:34
字数 1049
阅读 991
收藏 2

电话号码是有11位数字组成,所以在生成电话号码之前我们先来看一看怎样通过函数生成字符串。

DELIMITER $$
CREATE FUNCTION rand_num(n int) RETURNS VARCHAR(255)
BEGIN
    DECLARE chars_str varchar(20) DEFAULT '0123456789';
    DECLARE return_str varchar(255) DEFAULT '';
    DECLARE i INT DEFAULT 0;
    WHILE i < n DO
        SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*10 ),1));
        SET i = i +1;
    END WHILE;
    RETURN return_str;
END $$
DELIMITER ;

 MySQL的随机函数rand()返回的是一个float类型的数字nn的取值范围是0<=n<1。值得注意的是能取到0但是不能取到1

显然上面的rand()*10+1的取值范围为[1,11),能取到1但是不能取到11,内置函数floor的作用是向下取整。所以floor(rand()*10+1)的取值范围为[1,10]

因为MySQL中没有内置数组,所以我们用字符串来模拟,首先来看内置函数substringstr,x,y)是表示在字符串str中从x位置开始,截取长度为y的字符串。X1开始。

内置函数concat(str1,str2,…strn)的作用是把字符串str1strn拼接成一个字符串。所以上面的函数不难理解。就是每次循环从’0123456789’10个数字中随机截取一个数字拼接在我们要返回的字符串中。参数n表示拼接字符串的长度。

 

有了上面的函数,我们可以通过rand_num(11)这样的方式来得到一个字符串,但是我们可能得到的是00123456789这样的11数,显然不太像电话号码。没事我们再改进一下,为什么我们得到的字符串不像呢?因为一般电话号码都有固定的头,例如:136,189,156这样的,所以我们可以把这样的头加上,下面我们来写一个模拟得到手机头的函数。

DELIMITER $$
create function phone_head() returns char(3)
begin
-- 130 131 132 133 134 135 136 137 138 139 186 187 189 151 157常用的手机头
declare head char(3);
declare bodys varchar(100) default "130 131 132 133 134 135 136 137 138 139 186 187 189 151 157";
declare starts int;
set starts = 1+floor(rand()*15)*4;    
set head = trim(substring(bodys,starts,3));
return head;
end $$
DELIMITER ;

 我们还是有字符串来模拟,用空格分开。我们一共选取了15个号码头,每一个号码头有3位,所以我们截取字符串的开始位置从1,49····也就是start=1+4*n(0<=n<=14)。上面已经介绍了 rand()函数返回值nfloat 其中 0<=n<1,floor是向下取整

set head = substring(bodys,starts,3);在字符串bodys中从starts位置截取三位

下面我们来生成电话号码:

DELIMITER $$
create function gen_phone() returns varchar(20)
begin
declare phone varchar(20);
set phone = trim(concat(phone_head(),rand_num(8)));
return phone;
end $$
DELIMITER ;

我们先生成3位电话号码头,然后用rand_num(8) 生成8位数字,然后用concat内置函数把他们拼接在一起。

下面我们再来写一个存储过程来生成100个电话号码来看一看:

DELIMITER $$
create procedure insert_phone()
begin
declare i int default 0;
declare phone varchar(20);
set phone = trim(concat(phone_head(),rand_num(8)));
while i<100 do
insert into phone(phone) values(phone);
set i = i+1;
set phone = trim(concat(phone_head(),rand_num(8)));
end while;
end $$
DELIMITER ;

 上面的存储过程就是想phone表中插入100条我们写的函数生成的电话号码。接下来就是检验成果的时候了。还是先来创建一张表:

DROP TABLE IF EXISTS `phone`;
CREATE TABLE `phone` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `phone` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 调用我们的存储过程insert_phone

查看一下我们是否生成成功:

怎么样,是不是看样子有一点像电话号码了,我们以后写一些简单的测试数据的时候完全可以用MySQL提供给我们的函数来实现模拟生成测试数据。


© 著作权归作者所有

trayvon

trayvon

粉丝 18
博文 180
码字总数 262510
作品 1
程序员
私信 提问
加载中

评论(0)

MySQL入门(一)

第一部分:MySQL基础概念Mariadb的基础: 设计范式: 第一范式:字段是原子性的 第二范式:非主属性完全依赖于主属性 存在可用主键 第三范式:非主属性对主属性不存在传递函数依赖关系。 任何都不...

MT_IT
2017/12/10
0
0
在 MySQL 中根据规则生成随机密码

MySQL 5.0 以后的版本开始支持存储过程,存储过程具有壹致性、高效性和安全性。MySQL 5.0 之前的版本并不支持存储过程,然而随着 MySQL 技术的日趋完善,存储过程将在以后的项目中得到广泛的...

苗哥
2012/08/03
4K
10
MySQL · 实现分析 · 对字符集和字符序支持的实现

前言 在使用MySQL数据库的时候,常常会发现由于charset或collation设置不正确导致的各种问题。一方面由于数据在client和server之间传输需要做转换会导致CPU使用率增加;另一方面由于charset...

阿里云RDS-数据库内核组
2017/03/07
0
0
JDBC 学习(一)

一、MySql安装和登录 1.使用root权限登录mysql mysql -uroot -p 2.eclipse中添加驱动 mysql 官网上下载 mysql-connector-java-gpl-5.1.35.msi 镜像文件,直接安装 ,可以看 到在Mysql的安装的...

砍柴1990
2015/04/25
0
0
MySQL NULL的理解和应用

在本教程中,您将学习如何使用MySQL 值。 此外,您将学习一些有用的函数来有效地处理值。 MySQL NULL值简介 在MySQL中,值意味着未知值。 值不是零或空字符''值。值不等于其自身值。 如果将值...

易百教程
2016/10/21
46
0

没有更多内容

加载失败,请刷新页面

加载更多

spring cloud 是什么,学习什么

一、什么是springcloud,有什么作用   Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、...

FH-Admin
11分钟前
41
0
【招聘】医疗行业

产品经理(1人) 【岗位职责】 1.方案策划:对互联网医疗信息化项目全流程负责,包括产品的需求、开发、推广、实施各个过程;跟踪国内外最新进展、发展趋势、竞争厂家研发信息、国家政策信息...

挨踢得要死要死的某瓜
13分钟前
223
0
「网易官方」极客战记(codecombat)攻略-地牢-Kithgard 学徒kithgard-apprentice

那么这就是年轻的食人魔巫师和术士来研究的地方? 默认代码 # 你的目标是生存。 # 也很有趣。 也许能嬴上排行榜! # 你第一次来地牢的时候,应该没见过这个房间。 概览 这是你测试技能战术的...

极客战记
18分钟前
31
0
TI AM570x浮点DSP C66x + ARM Cortex-A15开发板的CSI2 CAMERA接口、以太网接口

TL570x-EVM是一款由创龙基于SOM-TL570x核心板设计的开发板,它为用户提供了SOM-TL570x核心板的测试平台,用于快速评估SOM-TL570x核心板的整体性能。 TL570x-EVM底板采用沉金无铅工艺的4层板设...

Tronlong创龙
26分钟前
23
0
程序员必须掌握的核心算法有哪些?

由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程...

摩尔12
37分钟前
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部