一、使用rand函數(shù)
select substring(md5(rand()), 1, length);
說明
- rand():隨機函數(shù)妒牙,會生成0~1之間的隨機數(shù)
- md5(input):散列函數(shù)饥伊,根據(jù)輸入值的不同,生成不同的32位字符串(但只有0~9杖剪,a~f共16種字符)
- substring(string, position, length):字符串截取函數(shù)洛巢,會截取字符串
string
從position
位置開始共length
個字符的子串次兆。
比如說稿茉,要生成一個10位的隨機字符串,可以使用如下語句:
select substring(md5(rand()), 1, 10);
運行結果:
mysql> select substring(md5(rand()), 1, 10);
+-------------------------------+
| substring(md5(rand()), 1, 10) |
+-------------------------------+
| f4c11e1f20 |
+-------------------------------+
1 row in set (0.00 sec)
該語句只能生成最長32位(但只有0~9芥炭,a~f共16種字符)的字符串漓库,如果需要更長的字符,可以使用concat
函數(shù)連接多個字符串园蝠,如下所示:
select concat(substring(md5(rand()), 1, 10), md5(rand()));
這個語句可以生成長度為42個字符的字符串渺蒿。
運行結果:
mysql> select concat(substring(md5(rand()), 1, 10), md5(rand()));
+-----------------------------------------------------+
| concat(substring(md5(rand()), 1, 10), md5(rand())) |
+-----------------------------------------------------+
| ba277110796b954eba43df14276eb80eef915685d9 |
+-----------------------------------------------------+
1 row in set (0.00 sec)
二、使用uuid函數(shù)
select replace(uuid(), '-', '');
說明
因為 uuid() 函數(shù)返回的字符串中會包含特殊字符 "-" 彪薛, 所以我們需要通過 replace 函數(shù)將這個特殊字符全部替換掉茂装。這種方式會得到一個32位的字符串,如果有長度要求善延,可以用substring或concat函數(shù)裁剪或拼接少态。
運行結果:
mysql> select replace(uuid(), '-', '');
+----------------------------------+
| replace(uuid(), '-', '') |
+----------------------------------+
| 6fe064bc86ee11ebbebe0242ac110002 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select substring(replace(uuid(), '-', ''), 1, 30);
+----------------------------------------------+
| substring(replace(uuid(), '-', ''), 1, 30) |
+----------------------------------------------+
| 8b3c7f1386ee11ebbebe0242ac1100 |
+----------------------------------------------+
1 row in set (0.00 sec)
mysql> select concat(substring(replace(uuid(), '-', ''), 1, 30), replace(uuid(), '-', ''));
+----------------------------------------------------------------------------------+
| concat(substring(replace(uuid(), '-', ''), 1, 30), replace(uuid(), '-', '')) |
+----------------------------------------------------------------------------------+
| cca1f72a86ee11ebbebe0242ac1100cca1f75b86ee11ebbebe0242ac110002 |
+----------------------------------------------------------------------------------+
1 row in set (0.01 sec)
三、使用自定義函數(shù)
DELIMITER $$
DROP FUNCTION IF EXISTS rand_string$$
CREATE FUNCTION `rand_string`(num INT) RETURNS varchar(255) CHARSET UTF8
BEGIN
DECLARE origin_str char(52) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str varchar(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < num DO
SET return_str = CONCAT(return_str, SUBSTRING(origin_str , FLOOR(1 + RAND()*52 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END $$
DELIMITER ;
說明
- DELIMITER $$ 定義結束符挚冤。MySQL默認的結束符是分號况增,但是函數(shù)體中可能用到分號。為了避免沖突训挡,需要另外定義結束符澳骤;
- DROP FUNCTION IF EXISTS rand_string$$ 如果函數(shù)rand_string已經存在了歧强,就刪除掉;
- CREATE FUNCTION 創(chuàng)建函數(shù)rand_string为肮,函數(shù)的參數(shù)是num摊册,返回值是varchar(255);
- 函數(shù)體放在BEGIN 與 END之間颊艳;
- DECLARE 聲明變量茅特,return_str類型是varchar(255),默認值是空棋枕;
- FLOOR(1 + RAND()*52 )獲取到1到52之間的隨機數(shù)
- CONCAT連接多個字符串白修;
- RETURN 返回拼接后的字符串return_str。
運行效果
mysql> DELIMITER $$
mysql> DROP FUNCTION IF EXISTS rand_string$$
Query OK, 0 rows affected (0.07 sec)
mysql> CREATE FUNCTION `rand_string`(num INT) RETURNS varchar(255) CHARSET UTF8
-> BEGIN
-> DECLARE origin_str char(52) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
-> DECLARE return_str varchar(255) DEFAULT '';
-> DECLARE i INT DEFAULT 0;
-> WHILE i < num DO
-> SET return_str = CONCAT(return_str, SUBSTRING(origin_str , FLOOR(1 + RAND()*52 ),1));
-> SET i = i +1;
-> END WHILE;
-> RETURN return_str;
-> END $$
Query OK, 0 rows affected (0.01 sec)
mysql> DELIMITER ;
mysql> select rand_string(10);
+-----------------+
| rand_string(10) |
+-----------------+
| OybKzoWRrm |
+-----------------+
1 row in set (0.00 sec)