添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

编程中经常遇到生成随机字符串的需求场景,比如验证码、初始密码等,一般情况下通过服务器端程序完成这个需求。笔者前面写的 Java中生成一个随机字符串 就是针对这种需求的。

但是,你可能还会遇到给数据库中所有数据新增一个字段,并且给一个随机的初始值的需求(是的,我遇到过),所以,有必要整理一些通过MySQL内置函数生成随机字符串的方法。

生成随机数字

MySQL中也有一个生成随机数的函数 RAND() 。生成的是0到1之间的随机浮点数。

mysql> select RAND();
+--------------------+
| RAND()             |
+--------------------+
| 0.6373184441005052 |
+--------------------+
1 row in set (0.04 sec)
借助字符串截取函数

实际需求中需要的大部分是一个连续的数字字符串,所以,可以使用SUBSTRING()函数截取浮点数的一部分。比如,我们需要一个6位的数字字符串:

mysql> select substring(rand(),3,6);
+-----------------------+
| substring(rand(),3,6) |
+-----------------------+
| 504347                |
+-----------------------+
1 row in set (0.00 sec)

SUBSTRING()是一个重载函数(MySQL里应该也叫重载函数,没有考证过),SUBSTRING(str, n)表示从str的第n个字符开始截取,直到str的结尾;SUBSTRING(str, n, m)表示从str的第n个字符开始截取,共截取m个字符。他们还可以表示为:SUBSTRING(str from n)SUBSTRING(str from n for m)。截取起始位置的字符计数从1开始。

mysql> select SUBSTRING('123456789', 3),SUBSTRING('123456789' from 3);
+---------------------------+-------------------------------+
| SUBSTRING('123456789', 3) | SUBSTRING('123456789' from 3) |
+---------------------------+-------------------------------+
| 3456789                   | 3456789                       |
+---------------------------+-------------------------------+
1 row in set (0.00 sec)
mysql> select SUBSTRING('123456789', 3, 2),SUBSTRING('123456789' from 3 for 2);
+------------------------------+-------------------------------------+
| SUBSTRING('123456789', 3, 2) | SUBSTRING('123456789' from 3 for 2) |
+------------------------------+-------------------------------------+
| 34                           | 34                                  |
+------------------------------+-------------------------------------+
1 row in set (0.00 sec)
mysql> select SUBSTRING('123456789', 9, 2),SUBSTRING('123456789' from 9 for 2);
+------------------------------+-------------------------------------+
| SUBSTRING('123456789', 9, 2) | SUBSTRING('123456789' from 9 for 2) |
+------------------------------+-------------------------------------+
| 9                            | 9                                   |
+------------------------------+-------------------------------------+
1 row in set (0.00 sec)
借助取整函数
mysql> SELECT CEILING(RAND()*500000+500000);
+-------------------------------+
| CEILING(RAND()*500000+500000) |
+-------------------------------+
|                        977906 |
+-------------------------------+
1 row in set (0.03 sec)
mysql> SELECT FLOOR(RAND()*500000 + 500000);
+-------------------------------+
| FLOOR(RAND()*500000 + 500000) |
+-------------------------------+
|                        940636 |
+-------------------------------+
1 row in set (0.03 sec)

FLOOR(n)返回小于等于n的最大整数。

mysql> select floor(5.0),floor(4.5),floor(-1.5);
+------------+------------+-------------+
| floor(5.0) | floor(4.5) | floor(-1.5) |
+------------+------------+-------------+
|          5 |          4 |          -2 |
+------------+------------+-------------+
1 row in set (0.04 sec)

CEILING(n)返回大于等于n的最小整数,可简写为CEIL(n)

mysql> select ceil(5.0),ceiling(5.0);
+-----------+--------------+
| ceil(5.0) | ceiling(5.0) |
+-----------+--------------+
|         5 |            5 |
+-----------+--------------+
1 row in set (0.00 sec)
mysql> select ceil(5.1),ceil(4.9);
+-----------+-----------+
| ceil(5.1) | ceil(4.9) |
+-----------+-----------+
|         6 |         5 |
+-----------+-----------+
1 row in set (0.00 sec)

生成随机数字和字母的组合

如果需要生成的随机字符串中既有数字又有字母,可以使用MD5将随机数加密,然后再截取。

mysql> select substring(MD5(RAND()),1,6);
+----------------------------+
| substring(MD5(RAND()),1,6) |
+----------------------------+
| 6b63ac                     |
+----------------------------+
1 row in set (0.03 sec)

假设现在有一个用户表,里面记录了用户名,但是现在有一个为了提需求而提出需求:给用户表增加一个密码列,并给每个用户设置一个随机密码。

mysql> select id,pwd from t_user;
+----+------+
| id | pwd  |
+----+------+
|  1 | NULL |
|  2 | NULL |
|  3 | NULL |
|  4 | NULL |
|  5 | NULL |
|  6 | NULL |
+----+------+
6 rows in set (0.00 sec)
mysql> update t_user set pwd = substring(MD5(RAND()),1,6);
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6  Changed: 6  Warnings: 0
mysql> select id,pwd from t_user;
+----+--------+
| id | pwd    |
+----+--------+
|  1 | 3aaa34 |
|  2 | 7e0ef6 |
|  3 | cc59c1 |
|  4 | f9d2c0 |
|  5 | 0b95b9 |
|  6 | 04ee59 |
+----+--------+
6 rows in set (0.00 sec)
BEGIN
	DECLARE i INT DEFAULT 1;
	DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwsyz';
	DECLARE startIndex INT DEFAULT 1;#起始索引
	DECLARE le
CREATE FUNCTION random_str(n int) RETURNS varchar(255) 
begin        
  declare chars_str varchar(100) 
  default "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  declare return
 drop function if exists rand_str;
 delimiter $$
 create function rand_str(size int,ran_type int) returns varchar(256) charset 'utf8'
begin
    # 定义接收初始化类型
    CHAR(FLOOR(65 + RAND() * 26)),
    CHAR(FLOOR(65 + RAND() * 26)),
    CHAR(FLOOR(65 + RAND() * 26))
) AS random_string;
这个示例将生成一个由三个随机大写字母组成的字符串。每个CHAR函数调用都会生成一个随机的ASCII码,并将其转换为对应的字符。使用CONCAT函数将这三个字符连接在一起,并将结果命名为random_string。
你可以根据需要调整生成随机字符串的长度和字符范围。例如,如果你想生成一个由六个随机小写字母组成的字符串,可以使用以下查询:
```sql
SELECT CONCAT(
    CHAR(FLOOR(97 + RAND() * 26)),
    CHAR(FLOOR(97 + RAND() * 26)),
    CHAR(FLOOR(97 + RAND() * 26)),
    CHAR(FLOOR(97 + RAND() * 26)),
    CHAR(FLOOR(97 + RAND() * 26)),
    CHAR(FLOOR(97 + RAND() * 26))
) AS random_string;
                    小白没太懂,有点迷了,课程上说的是:
● 基本类型作为形参时, 传递的是数值, 所以形参的改变对实参没有任何影响.
● 引用类型作为形参时, 传递的是地址值, 所以形参的改变直接影响实参.
[code=java]
public class MethodDemo02 {
    public static void main(String[] args) {
        int[] arr = {10, 20, 30};
        System.out.println("调用change方法前:" + arr[1]);
        change(arr);
        System.out.println("调用change方法后:" + arr[1]);
    public static void change(int[] arr) {
        arr[1] = 200;
[/code]