MySQL建立隨機生成電話的儲存函式

SmoothSailingT發表於2024-03-02

1.

CREATE FUNCTION func_generatePhone() RETURNS CHAR(11) CHARSET utf8 DETERMINISTIC
 

 建立一個名為func_generatePhone的函式,返回型別為CHAR(11),字符集為utf8,確定性函式。

 2.

 DECLARE head VARCHAR(100) DEFAULT '130,156,136,176,131,133';

 宣告一個名為head的變數,型別為VARCHAR(100),預設值為'130,156,136,176,131,133'。該變數儲存手機號的前三位數。

 3.

 DECLARE content CHAR(10) DEFAULT '0123456789';

 宣告一個名為content的變數,型別為CHAR(10),預設值為'0123456789'。該變數儲存手機號剩餘的數字部分。

 4.

 WHILE LOCATE(',', head_array) > 0 DO
    SET head_count = head_count + 1;
    SET head_array = SUBSTRING(head_array, LOCATE(',', head_array) + 1);
END WHILE;

 透過迴圈計算號碼段的數量。每次迴圈,將head_count加1,同時將head_array擷取逗號後的部分,直到找不到逗號為止。

 5.

 SET head_count = head_count + 1;
SET selected_head = SUBSTRING_INDEX(SUBSTRING_INDEX(head, ',', FLOOR(1 + RAND() * head_count)), ',', -1);

 在號碼段陣列中隨機選擇一個號碼段作為手機號的前三位數。首先將號碼段數量加1,然後根據隨機數生成一個索引值,再透過SUBSTRING_INDEX函式獲取對應的號碼段。

 6.

 SET phone = CONCAT(selected_head, SUBSTRING(content, FLOOR(1 + RAND() * LENGTH(content)), 1));

 將選定的號碼段和隨機選擇的一位數字拼接到phone變數中。

 7.

 WHILE LENGTH(phone) < 11 DO
    SET phone = CONCAT(phone, SUBSTRING(content, FLOOR(1 + RAND() * LENGTH(content)), 1));
END WHILE;

 透過迴圈生成剩餘的手機號碼位數,直到phone的長度達到11位為止。每次迴圈,將隨機選擇的一位數字拼接到phone變數中。

 完整程式碼

DELIMITER //

CREATE FUNCTION func_generatePhone() RETURNS CHAR(11) CHARSET utf8 DETERMINISTIC
BEGIN
    DECLARE head VARCHAR(100) DEFAULT '130,156,136,176,131,133';
    DECLARE content CHAR(10) DEFAULT '0123456789';
    DECLARE phone CHAR(11) DEFAULT '';

    -- 將號碼段拆分為陣列
    DECLARE head_array VARCHAR(100) DEFAULT head;
    DECLARE head_count INT DEFAULT 0;
    DECLARE selected_head VARCHAR(3);

    WHILE LOCATE(',', head_array) > 0 DO
        SET head_count = head_count + 1;
        SET head_array = SUBSTRING(head_array, LOCATE(',', head_array) + 1);
    END WHILE;

    SET head_count = head_count + 1;
    SET selected_head = SUBSTRING_INDEX(SUBSTRING_INDEX(head, ',', FLOOR(1 + RAND() * head_count)), ',', -1);

    -- 隨機選擇一個號碼段作為手機號的前三位數
    SET phone = CONCAT(selected_head, SUBSTRING(content, FLOOR(1 + RAND() * LENGTH(content)), 1));

    -- 生成後續號碼
    WHILE LENGTH(phone) < 11 DO
        SET phone = CONCAT(phone, SUBSTRING(content, FLOOR(1 + RAND() * LENGTH(content)), 1));
    END WHILE;

    RETURN phone;
END //

DELIMITER ;

 結果:

 

相關文章