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
あるいは、生成する関数を書くことができます。あなたが望む文字列の長さを指定することができ、あなたの質問で指定した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 ;
回答№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