Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我是否在MySQL中向VARCHAR(str_len)传递一个变量?_Mysql - Fatal编程技术网

为什么可以';我是否在MySQL中向VARCHAR(str_len)传递一个变量?

为什么可以';我是否在MySQL中向VARCHAR(str_len)传递一个变量?,mysql,Mysql,在做了多年的MSSQL之后,我又回到了MySQL,这是一个相当具有挑战性的工作。我的noob问题是,为什么我不能将变量传递给VARCHAR(string\u length),如下所示: CREATE FUNCTION `get_random_strings` (string_length INT) RETURNS VARCHAR(string_length) BEGIN DECLARE return_string VARCHAR(string_length); SELECT c

在做了多年的MSSQL之后,我又回到了MySQL,这是一个相当具有挑战性的工作。我的noob问题是,为什么我不能将变量传递给
VARCHAR(string\u 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

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

不需要。当
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)
       );

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

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
CREATE DEFINER=`root`@`localhost`函数`get_varchar`(in_length varchar(2000))返回varchar(2000)字符集utf8mb4
确定性
返回子字符串(对于in_长度,从1返回MD5(RAND())
CREATE DEFINER=`root`@`localhost`过程`dummy\u insert`()
开始
声明计数器INT默认值为1;
声明默认值为100000的总行数;

而我将首先检查如何在MySQL中定义参数。我决定使用mysql中现有的get函数,这是一本手册。我刚看到他们。感谢@RiggsFollyth MySQL中的SQL语法分析器只支持VARCHAR长度的数值文本。您可以在SQL Server上执行此操作吗?非常确定,在本例中,您不能将其设为varchar(max)或确定最大长度,尝试动态指定varchar的长度没有任何好处,varchar会根据数据的大小自动调整其大小。您好@Jpsh,您是对的。在sql server中也不能执行此操作。谢谢你纠正我。谢谢@Schwern,我在做一个虚拟数据发生器。我想知道如何做一个函数,它接受一个可变长度的参数并返回一个具有该长度的字符串。但是我知道char和varchar的区别。我只想创建一个可以在insert语句中调用的函数,如下所示:insert INTO
db
table
messageuid
accountid
jmessage
已发送
lmessage
)值(get_varchar(100),get_int(),get_varchar(500),get_varchar(50)、get_bit()、get_varchar(2000);@Sol我想可能就是这样。很高兴你把它解决了。一个调用
rand
的函数不应该是
确定性的
。选中
选择get_varchar(5),get_varchar(5)
。我想你会得到两次相同的字符串。