当前位置: 首页 > 知识库问答 >
问题:

MySQL局部变量值意外变化

马沛
2023-03-14

我有一张带有以下原型的桌子:

CREATE TABLE `T2` (
`ID` int(11) DEFAULT NULL,
`NAME` varchar(100) DEFAULT NULL
)

我想创建一个过程来插入具有特定长度的随机字符串,我写了以下内容:

DELIMITER ;;
CREATE PROCEDURE STRGEN ( IN ITER INT) BEGIN
    DECLARE COUNTER INT DEFAULT 0;
    DECLARE _STR VARCHAR(1000) DEFAULT NULL;

    WHILE COUNTER < @ITER DO
        SET _STR = CONCAT(_STR , CHAR(RAND()*100+65));
        SET COUNTER = COUNTER + 1;
    END WHILE;

    INSERT INTO T2 VALUES(RAND()*100 , _STR);
END;;

这样说:

CALL STRGEN(100);

问题是它插入NULL作为NAME字段。
我的怀疑是,当同时循环终止时,对_STR所做的更改超出了范围。

我还尝试使用如下的全局变量:

CREATE PROCEDURE STRGEN ( IN ITER INT) BEGIN
DECLARE COUNTER INT DEFAULT 0;
DECLARE _STR VARCHAR(1000) DEFAULT NULL;

SET @S = NULL;

WHILE (COUNTER < @ITER) DO
    SET _STR = CONCAT(_STR , CHAR(RAND()*100+65));
    SET COUNTER = COUNTER + 1;
    SET @S = _STR;
END WHILE;
INSERT INTO T2 VALUES(RAND()*100 , @S);
END;;

也在程序之外声明了@S,但没有发生什么特别的事情

感谢您的帮助<向你问好。

共有1个答案

沃学
2023-03-14

当我尝试运行您的过程时,我遇到了以下错误:

错误代码:1366。不正确的字符串值:'\x87'用于第1行0.000秒处的列'_STR'

您似乎没有生成有效的字符。。。我尝试了一种不同的字符生成器逻辑,它工作正常。

DELIMITER ;;
CREATE PROCEDURE STRGEN ( IN ITER INT) BEGIN
    DECLARE COUNTER INT DEFAULT 0;
    DECLARE _STR VARCHAR(1000) DEFAULT ''; -- change the initial value to ''

    WHILE COUNTER < @ITER DO
        -- SET _STR = CONCAT(_STR , CHAR(RAND()*100+65));

        -- if I change the logic for generating random char, then I get expected result
        SET _STR = CONCAT(_STR , LEFT(MD5(RAND()), 1));
        SET COUNTER = COUNTER + 1;
    END WHILE;

    INSERT INTO T2 VALUES(RAND()*100 , _STR);
END;;
 类似资料:
  • 主要内容:局部变量,全局变量,局部变量和全局变量的综合示例在《 C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。 所谓 作用域( Scope ) ,就是变量的有效范围。 不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。 局部变量 定义在函数内部的变量称为 局部变量(Local Variable) ,

  • Lua 的设计有一点很奇怪,在一个 block 中的变量,如果之前没有定义过,那么认为它是一个全局变量,而不是这个 block 的局部变量。这一点和别的语言不同。容易造成不小心覆盖了全局同名变量的错误。 定义 Lua 中的局部变量要用 local 关键字来显式定义,不使用 local 显式定义的变量就是全局变量: g_var = 1 -- global var local l_va

  • 简介 在前面的章节中,我已经讲述了如何定义函数。在本节中,我讲介绍局部变量,这将会使定义函数变得更加容易。 let表达式 使用let表达式可以定义局部变量。格式如下: (let binds body) 变量在binds定义的形式中被声明并初始化。body由任意多个S-表达式构成。binds的格式如下: [binds] → ((p1 v1) (p2 v2) ...) 声明了变量p1、p2,并分别

  • 局部变量用于模版渲染,也就是模版中的 site 变量。 默认变量 变量 描述 posts 所有文章 pages 所有分页 categories 所有分类 tags 所有标签 获取变量 hexo.locals.get('posts') 设置变量 hexo.locals.set('posts', function(){ return ... }); 移除变量 hexo.locals.remove(

  • 问题内容: 我了解Python中局部变量和全局变量的概念,但是我只是有一个问题,为什么下面的代码中会出现错误?Python逐行执行代码,因此在读取第5行之前,它不知道a是局部变量。Python尝试执行第5行后,会回退一行并将其标记为错误吗? 问题答案: 设置和测试 为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题: 版画。因此,调用此函数不是问题,而是在下一个函数上: 我们收到一个错误

  • 局部变量使用关键字 def 来声明,其只在声明它的地方可见 . 局部变量是 Groovy 语言的一个基本特性. 例子 13.2 . 使用局部变量 def dest = "dest" task copy(type: Copy) { form "source" into dest }