/ / MySQLでランダムな英数字を生成するにはどうすればいいですか? - mysql

どのようにいくつかの文字と数字に制限するMySQLでランダムな英数字を生成するには? - mysql

MySQLでランダムな英数字を生成する方法

たとえば、0、1、o、lを含まないランダムな英数字を生成したい

前もって感謝します。

回答:

回答№1の場合は3

あなたはランダムな文字を生成することができますASCII文字を取得するためのRAND()関数およびCHAR()関数。次の例では、20行の英数字(5文字の長さ)が表示されます。これには、次のように指定して指定した文字が含まれます。 HAVING 一番下の節。

CHAR(FLOOR(RAND()*10)+48) 0から9までのランダムな数字を与えます
CHAR(FLOOR(RAND()*26)+65) ランダムな大文字を与えます
CHAR(FLOOR(RAND()*26)+97) ランダムな小文字を与えます
そしてこれらは一緒にUNIONされています ORDER BY rand() LIMIT 1 それらの中からランダムに1文字を選択し、それを各文字に対して完全にランダムにします。このコードは5回カットアンドペーストされ、5文字の長さのランダムな文字列が得られます。

SELECT CONCAT(
(SELECT CHAR(FLOOR(RAND()*10)+48) as chr UNION SELECT CHAR(FLOOR(RAND()*26)+65) UNION SELECT CHAR(FLOOR(RAND()*26)+97) ORDER BY rand() LIMIT 1),
(SELECT CHAR(FLOOR(RAND()*10)+48) as chr UNION SELECT CHAR(FLOOR(RAND()*26)+65) UNION SELECT CHAR(FLOOR(RAND()*26)+97) ORDER BY rand() LIMIT 1),
(SELECT CHAR(FLOOR(RAND()*10)+48) as chr UNION SELECT CHAR(FLOOR(RAND()*26)+65) UNION SELECT CHAR(FLOOR(RAND()*26)+97) ORDER BY rand() LIMIT 1),
(SELECT CHAR(FLOOR(RAND()*10)+48) as chr UNION SELECT CHAR(FLOOR(RAND()*26)+65) UNION SELECT CHAR(FLOOR(RAND()*26)+97) ORDER BY rand() LIMIT 1),
(SELECT CHAR(FLOOR(RAND()*10)+48) as chr UNION SELECT CHAR(FLOOR(RAND()*26)+65) UNION SELECT CHAR(FLOOR(RAND()*26)+97) ORDER BY rand() LIMIT 1)
) as randstr
FROM
(SELECT 1 FROM
(SELECT 0 as v UNION SELECT 1)T1,
(SELECT 0 as v UNION SELECT 2)T2,
(SELECT 0 as v UNION SELECT 4)T3,
(SELECT 0 as v UNION SELECT 8)T4,
(SELECT 0 as v UNION SELECT 16)T5,
(SELECT 0 as v UNION SELECT 32)T6
)T
HAVING randstr NOT LIKE "%1%"
AND randstr NOT LIKE "%0%"
AND randstr NOT LIKE "%o%"
AND randstr NOT LIKE "%l%"
LIMIT 20

sqlFiddle

あるいは、生成する関数を書くことができます。あなたが望む文字列の長さを指定することができ、あなたの質問で指定した4文字を除外するためにそれをチェックさせることができる以下のようなあなたのためのランダムな文字列

DELIMITER //
CREATE FUNCTION randString(in_length INT) RETURNS VARCHAR(50)
BEGIN
SET @len = 0;
SET @returnValue = "";
WHILE (@len < in_length) DO
SET @randChar = "0";
WHILE (@randChar IN ("0","1","o","l")) DO
SET @randChar = (      SELECT CHAR(FLOOR(RAND()*10)+48) as chr
UNION SELECT CHAR(FLOOR(RAND()*26)+65)
UNION SELECT CHAR(FLOOR(RAND()*26)+97)
ORDER BY rand() LIMIT 1);
END WHILE;
SET @returnValue = CONCAT(@returnValue,@randChar);
SET @len = @len + 1;
END WHILE;
RETURN @returnValue;
END//
DELIMITER ;

sqlFiddle


回答№2の場合は0

ご回答ありがとうございます。私はうまく動作するようなクエリを作成します。

SELECT CONCAT(
(SELECT  CASE WHEN a.aa="0" THEN "a"
WHEN a.aa="1" THEN "b"
WHEN a.aa="l" THEN "g"
WHEN a.aa="o" THEN "q"
ELSE a.aa
END AS d
FROM (SELECT LCASE(CONV(FLOOR(RAND()*36),10,36)) AS aa) AS a),
(SELECT  CASE WHEN a.aa="0" THEN "a"
WHEN a.aa="1" THEN "b"
WHEN a.aa="l" THEN "g"
WHEN a.aa="o" THEN "q"
ELSE a.aa
END AS d
FROM (SELECT LCASE(CONV(FLOOR(RAND()*36),10,36)) AS aa) AS a),
(SELECT  CASE WHEN a.aa="0" THEN "a"
WHEN a.aa="1" THEN "b"
WHEN a.aa="l" THEN "g"
WHEN a.aa="o" THEN "q"
ELSE a.aa
END AS d
FROM (SELECT LCASE(CONV(FLOOR(RAND()*36),10,36)) AS aa) AS a),
(SELECT  CASE WHEN a.aa="0" THEN "a"
WHEN a.aa="1" THEN "b"
WHEN a.aa="l" THEN "g"
WHEN a.aa="o" THEN "q"
ELSE a.aa
END AS d
FROM (SELECT LCASE(CONV(FLOOR(RAND()*36),10,36)) AS aa) AS a),
(SELECT  CASE WHEN a.aa="0" THEN "a"
WHEN a.aa="1" THEN "b"
WHEN a.aa="l" THEN "g"
WHEN a.aa="o" THEN "q" ELSE a.aa
END AS d
FROM (SELECT LCASE(CONV(FLOOR(RAND()*36),10,36)) AS aa) AS a),
(SELECT  CASE WHEN a.aa="0" THEN "a"
WHEN a.aa="1" THEN "b"
WHEN a.aa="l" THEN "g"
WHEN a.aa="o" THEN "q" ELSE a.aa
END AS d
FROM (SELECT LCASE(CONV(FLOOR(RAND()*36),10,36)) AS aa) AS a),
(SELECT  CASE WHEN a.aa="0" THEN "a"
WHEN a.aa="1" THEN "b"
WHEN a.aa="l" THEN "g"
WHEN a.aa="o" THEN "q"
ELSE a.aa
END AS d
FROM (SELECT LCASE(CONV(FLOOR(RAND()*36),10,36)) AS aa) AS a)
)AS NAME