MySQL-生成随机数字、字符串、日期、验证码及 UUID的方法
一、生成随机数字
1. 生成 0 到 1 之间的随机数
MySQL 中的 RAND 函数可以用于生成一个大于等于 0 小于 1 的随机数字。例如:
SELECT rand();
该函数返回的数据类型为 double,包含 16 位小数;每次调用都会返回不同的数据。
如果想要重现某些场景,需要确保每次运行时生成相同的随机数。这种情况下可以为 RAND 函数传递一个输入参数,设置一个随机数种子。例如:
SELECT rand(1);
从结果可以看出,相同的种子返回了相同的随机数。
2. 生成指定范围内的随机数
基于 RAND 函数和数学运算,可以返回任意两个数字之间的随机数:
low + RAND() * (high − low)
以上表达式将会返回一个大于等于 low,小于 high 的随机数。例如:
SELECT 10 + rand() * 10;
以上示例返回了一个大于等于 10 且小于 20 的随机数字。
如果想要生成某个范围内的随机整数,可以加上 FLOOR 函数。例如:
SELECT floor(10 + rand() * (10)) AS rd;
该语句返回了一个大于等于 10,小于等于 19(不是 20)的随机整数。
3. 生成 6 位数字手机验证码
我们已经获得了指定范围内的随机整数,加上 LPAD 函数就可以生成由 6 位数字字符组成的手机验证码。例如:
SELECT lpad(floor(rand() * 1000000), 6, '0') AS captcha;
其中,lpad 函数可以确保数据不够 6 位时在前面补足 0。
4. 生成遵循正态分布的随机数
RAND 函数生成的是一个遵循均匀分布的随机数,MySQL 没有提供生成遵循正态分布(normal distribution)的随机数。我们可以创建一个存储函数来模拟正态分布的随机数:
delimiter //
create function normal_distrib(mean double, stdev double)
returns double no sql
begin
set @x = rand(), @y = rand();
set @nd = (sqrt(-2 * log(@x)) * cos(2 * pi() * @y)) * stdev + mean;
return @nd;
end
//
delimiter ;
以上函数利用 Box-Muller 变换算法通过两个平均分布的随机数生成正态分布的随机数。
以下语句通过 normal_distrib 函数生成了一个期望值为 0,标准差为 1 的正态分布随机数:
SELECT normal_distrib(0,1);
以下语句可以用于验证 normal_distrib 函数是否遵循正态分布:
with recursive temp(val) as (
select normal_distrib(0,1)
union all
select normal_distrib(0,1)
from temp
limit 1000000
)
select /*+ set_var(cte_max_recursion_depth = 1m) */avg(val),std(val)
from temp;
通过运行 1000000 次,计算这些数据的平均值和标准差,返回结果非常接近 0 和 1。
二、生成随机字符串
1. 生成固定长度的随机字符串
除了随机数字之外,有时候我们也需要生成一些随机的字符串。MySQL 没有提供专门生成随机字符串的函数,但是可以通过其他函数进行模拟。例如:
SELECT char(floor(rand() * 26)+65) as rand_char;
以上查询返回了一个随机的大写字母,char 函数用于将 ASCII 码转换为对应的字符。我们可以基于该查询进一步创建一个存储函数:
delimiter //
create function rand_string(len integer)
returns text no sql
begin
declare counter int default 1;
declare str text default ''; if len < 1 then
return null;
end if; while counter <= len do
set str = concat(str, char(floor(rand() * 94) + 33));
set counter = counter + 1;
end while; return str; end //
delimiter ;
rand_string 函数可以返回由任意可打印字符(ASCII 码从 33 到 126)组成的随机字符串。例如:
select rand_string(8) ;
以上示例返回了一个长度为 8,由可打印字符组成的随机字符串。
另外,MySQL 中的 elt 函数也可以用于返回指定位置中的元素。例如:
SELECT elt(1 + floor(rand() * 36),
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N',
'O','P','Q','R','S','T',
'U','V','W','X','Y','Z') as val;
以上语句返回了一个随机的数字或者大写字母,将其替换到 rand_string 函数可以返回一个由数字和大写字母组成的随机字符串。
2. 生成可变长度的随机字符串
那么,怎么返回一个长度可变的随机字符串呢?很简单,为 rand_string 函数指定一个随机的长度参数即可。例如:
SELECT rand_string(floor(10 + rand() * 11));
以上示例返回了一个长度大于等于 10 且小于等于 20,由可打印字符组成的随机字符串。
三、生成随机日期和时间
将指定日期增加一个随机的数字,就可以得到随机的日期。例如:
SELECT date_add('2020-01-01', interval rand() * 31 day) rand_date;
以上示例返回了 2020 年 1 月中的某个随机日期。以下语句则返回了一天中的某个随机时间:
SELECT sec_to_time(rand() * 3600) rand_time;
其中,sec_to_time 函数用于将秒数转换为时间数据。
四、获取表中的随机记录
对于返回多行数据的查询语句,RAND 函数每次都会返回不同的随机数据。例如:
SELECT rand(1) FROM employee;
利用这个特性,我们可以从表中返回随机的数据行。例如:
SELECT emp_id,emp_name
FROM employee
ORDER BY rand(1)
LIMIT 5;
以上示例从 employee 表中返回了 5 行随机记录。该方法需要为表中的每行数据都生成一个随机数,然后进行排序;所以会随着表中的数据量增加而逐渐变慢。
如果表中存在自增主键,也可以基于主键生成一个随机数据。例如:
SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id;
然后基于这个随机数返回一条随机的记录:
SELECT e.emp_id, e.emp_name
FROM employee e
INNER JOIN (SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id
) AS t
WHERE e.emp_id >= t.id
LIMIT 1;
这种方法一次只能返回一条随机记录,而且只有当自增字段的值没有间隙时才会返回均匀分布的随机记录。
五、生成 UUID
UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一个 128 比特的数字,可以用于唯一标识每个网络对象或资源。由于它的生成机制,一个 UUID 可以保证几乎不会与其他 UUID 重复,因此常常用于生成数据库中的主键值。
MySQL 提供了一个系统函数 UUID,可以用于生成 UUID。例如:
SELECT uuid();
如果想要生成没有中划线(-)的 UUID,可以使用 REPLACE 函数:
SELECT replace(uuid(),'-','');
除此之外,MySQL 还提供了一个UUID_SHORT 函数,它可以返回一个 64 比特的无符号整数。例如:
SELECT uuid_short();
该函数返回的是一个“短的”唯一标识符,只有满足以下条件时才具有唯一性:
- 当前服务器的 server_id 位于 0 到 255 之间,并且在复制结构中具有唯一性;
- 重启 mysqld 前后没有将服务器主机的系统时间往回调整;
- 每秒钟的平均调用次数少于 1600 万次。
MySQL-生成随机数字、字符串、日期、验证码及 UUID的方法的更多相关文章
- Mysql 生成随机数字
其实思路很简单,利用MySQL现有的函数,然后进行加工处理,达到预期的结果.可以用到的MySQL函数为rand() ,以及 round() 函数. 具体为:select round(rand()*10 ...
- Java随机字符串:随机数字字符串,工具类
Java中生成随机数,字符串的工具类 1. 调用方法需要传入生成字符串的长度和需要的类型 生成随机数字 生成随机字母字符串 生成随机字符串+数字等 ......... 2. 总共8种类型,具体看工具类 ...
- sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期
问题:在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期.而自带的系统表mast ...
- Javascript将字符串日期格式化为yyyy-mm-dd的方法 js number 类型 没有length 属性 string类型才有
日期格式化相信对于大家来说再熟悉不过,最近工作中自己利用Javascript就写了一个,现在将实现的代码分享给大家,希望对有需要的朋友们能有所帮助,感兴趣的朋友们下面来一起看看吧. 这篇文章主要介绍的 ...
- pyhton2 and python3 生成随机数字、字母、符号字典(用于撞库测试/验证码等)
本文介绍Python3中String模块ascii_letters和digits方法,其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字0-9.string.p ...
- 利用JavaScript生成随机数字!
<!DOCTYPE html> <html> <head> <title>1-99的随机数字</title> <script type ...
- mysql生成随机测试数据
一个demo: CREATE TABLE dept_InnoDB( deptno MEDIUMINT NOT NULL DEFAULT 0 , dname VARCHAR(20) NOT NULL ...
- python faker 生成随机类型字符串
以前生成测试字符时,用random模块拼来拼去来生成随机串,如姓名,手机,身份证等,还是费一些功夫,不过有了faker模块,一切变得简单起来 基本使用: from faker import Faker ...
- Oracle中如何生成随机数字、随机字符串、随机日期
.随机小数 dbms_random.value(low,high): --获取一个[low,high)之间的小数,包含low,不包含high 可以结合trunc函数获取整数 例如: select db ...
- mysql生成随机日期
生成一天内随机时间 select sec_to_time(rand() * 86400); 生成一天内随机时间,floor取整秒 select sec_to_time(floor(rand() * 8 ...
随机推荐
- C#设计模式03——简单工厂的写法
什么是C#简单工厂? C#简单工厂是一种创建对象的设计模式,它定义一个工厂类来创建指定类型的对象,而不是在客户端代码中直接创建对象.简单工厂模式通常使用静态方法来生成对象,并且这些静态方法通常被称为工 ...
- 机器学习-线性分类-支持向量机SVM-合页损失-SVM输出概率值-16
目录 1. SVM概率化输出 2. 合页损失 1. SVM概率化输出 标准的SVM进行预测 输出的结果是: 是无法输出0-1之间的 正样本 发生的概率值 sigmoid-fitting 方法: 将标准 ...
- 通过设置 Chrome 解决开发调用跨域问题
转载请注明出处: 项目采用的是前后端分离的方式,前端本地访问方式是 localhost:8080,访问本地后台服务时,通过 localhost:9000 进行访问 本地后端服务.在本地通过chrome ...
- Nacos源码 (4) 配置中心
本文阅读nacos-2.0.2的config源码,编写示例,分析推送配置.监听配置的原理. 客户端 创建NacosConfigService对象 Properties properties = new ...
- 6. 配置项:relabel_config
6.1relabel_config的位置 6.2 relabel_config参数详解 1.replace 2. keep 3.drop 6.labelkeep 7.hashmod 6.3 正则表达式 ...
- SV 设计特性
过程语句块特性 ABC 过程块语句 always_comb 防止多驱动的问题:赋值块左侧的语句无法被另一个过程块赋值 if语句没有写else,sv会提示警告,sv认为是latch always不会再仿 ...
- SpringMVC - 加载静态资源
静态资源过滤 spring-config.xml <!-- 3,(1)让Spring MVC不处理静态资源 .(2)加载静态资源,也称为资源过滤 --> <mvc:default-s ...
- [转帖]查看mysql分区名和各分区数据量
– 查看mysql分区名和各分区数据量 SELECT table_name, partition_name, table_rows FROM information_schema.PARTITIONS ...
- CentOS7上面一键部署rabbitmq的简单方法
1. rabbitmq的安装部署比redis之类的要麻烦一些. 主要是他是基于erlang写的 而不是基于c或者是c++写的 2. 很多时候编译需要添加很多组件, 但是一些机器可能不会让添加这么多的组 ...
- Ant Design Vue分页Pagination
<template> <div> <a-pagination show-quick-jumper v-model:current="current1" ...