为什么我不能在MySQL中将变量传递给VARCHAR(str_len)?

时间:2020-10-06 15:32:00

标签: mysql

经过多年的MSSQL处理,我又回到了MySQL,这非常具有挑战性。我的菜鸟问题是,为什么不能像下面这样传递变量到VARCHAR(string_length)

CREATE FUNCTION `get_random_strings` (string_length INT)
RETURNS VARCHAR(string_length)
BEGIN
    DECLARE return_string VARCHAR(string_length);

    SELECT concat(
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97)
        )AS Random10CharacterString
    RETURN 1;
END

如何根据参数返回具有长度的字符串?

2 个答案:

答案 0 :(得分:0)

您不需要。 char是固定长度,而varchar var 有效长度。 varchar(255)生成一个最大最多255个字符的字符串。

除非有特殊原因要限制返回字符串的长度,否则varchar(255)很好。它只会使用所需的内存。

可以更简单地编写该函数,如下所示:

create function get_random_strings()
returns varchar(255)
no sql
return concat(
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97),
        char(round(rand()*25)+97)
       );

答案 1 :(得分:0)

感谢您的所有回答,我正在制作一个虚拟数据生成器,我就是这样做的:

CREATE DEFINER=`root`@`localhost` FUNCTION `get_varchar`(in_length varchar(2000)) RETURNS varchar(2000) CHARSET utf8mb4
    DETERMINISTIC
RETURN SUBSTRING(MD5(RAND()) FROM 1 FOR in_length)

CREATE DEFINER=`root`@`localhost` PROCEDURE `dummy_insert`()
BEGIN
    DECLARE counter INT DEFAULT 1;
    DECLARE total_rows INT DEFAULT 100000;
    WHILE counter <= total_rows DO
        INSERT INTO `db`.`table`
        (
        `messageuid`,
        `accountid`,
        `jmessage`,
        `kmessage`,
        `is_sent`,
        `lmessage`
        )
        VALUES
        (
        get_varchar(100),
        get_int(),
        get_varchar(500),
        get_varchar(50),
        get_bit(),
        get_varchar(2000);

    END WHILE;
END
相关问题