【问题标题】:Declaring and using MySQL varchar variables声明和使用 MySQL varchar 变量
【发布时间】:2026-01-14 00:00:01
【问题描述】:

我正在尝试对 MySQL 5.0 中的变量进行一些简单的操作,但我无法让它正常工作。我已经看到许多(非常!)不同的 DECLARE/SET 语法,我不知道为什么......无论如何我可能会混淆它们/选择错误的/混合它们。

这是一个失败的最小片段:

DECLARE FOO varchar(7);
DECLARE oldFOO varchar(7);
SET FOO = '138';
SET oldFOO = CONCAT('0', FOO);

update mypermits 
   set person = FOO 
 where person = oldFOO;

我也试过用 BEGIN... END;并作为一个程序。在这种情况下,MySQL Workbench 很有帮助地告诉我:第一行是“')' 附近的 SQL 语法错误”,第二行是“'DECLARE oldFOO varchar(7)' 附近的 SQL 语法错误”。否则,它会将两行都显示为完整的错误,并在两者上都显示“SQL 语法错误接近 ...”。

编辑:我忘了提到我已经在变量上使用和不使用@s 进行了尝试。有些资源有,有些没有。

我犯了什么愚蠢的错误?

【问题讨论】:

  • 准确发布您尝试使用的内容,因为我创建了一个新程序,使用您提供的内容没有出现语法错误 - 请参阅我的答案。

标签: sql mysql mysql-error-1064


【解决方案1】:

这对使用 MySQL 5.1.35 的我来说很好:

DELIMITER $$

DROP PROCEDURE IF EXISTS `example`.`test` $$
CREATE PROCEDURE `example`.`test` ()
BEGIN

  DECLARE FOO varchar(7);
  DECLARE oldFOO varchar(7);
  SET FOO = '138';
  SET oldFOO = CONCAT('0', FOO);

  update mypermits
     set person = FOO
   where person = oldFOO;

END $$

DELIMITER ;

表:

DROP TABLE IF EXISTS `example`.`mypermits`;
CREATE TABLE  `example`.`mypermits` (
  `person` varchar(7) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO mypermits VALUES ('0138');

CALL test()

【讨论】:

  • 这似乎行得通!显然,分隔符命令是我需要的。到目前为止,这对我来说很神奇......让我查一下。
  • 如果我想声明一个可以存储最大值的字符串变量怎么办? @OMGPonis
【解决方案2】:

我在使用 MySQL Workbench 时遇到了同样的问题。根据MySQL documentationDECLARE“声明在存储程序中声明局部变量”。这显然意味着它只能保证与存储过程/函数一起使用。

我的解决方案是简单地删除DECLARE 语句,并在SET 语句中引入变量。对于您的代码,这意味着:

-- DECLARE FOO varchar(7); 
-- DECLARE oldFOO varchar(7);

-- the @ symbol is required
SET @FOO = '138'; 
SET @oldFOO = CONCAT('0', FOO);

UPDATE mypermits SET person = FOO WHERE person = oldFOO;

【讨论】:

  • 您将需要一个@ 符号来设置存储过程/函数之外的变量。例如SET @F00 = '138'
【解决方案3】:

看起来你忘记了变量声明中的@。我还记得很久以前在 MySql 中遇到SET 的问题。

试试

DECLARE @FOO varchar(7);
DECLARE @oldFOO varchar(7);
SELECT @FOO = '138';
SELECT @oldFOO = CONCAT('0', @FOO);

update mypermits 
   set person = @FOO 
 where person = @oldFOO;

【讨论】:

  • 对不起,我忘了提到当我将@s 放在变量上时错误仍然存​​在(就像我最初拥有的那样。)
【解决方案4】:

试试这个:

declare @foo    varchar(7),
        @oldFoo varchar(7)

set @foo = '138'
set @oldFoo = '0' + @foo

【讨论】:

  • "'declare @foo varchar(7), @oldFoo varchar(7)'附近的 SQL 语法错误"
  • 我只是将它复制并粘贴到一个新查询上,它可以正常工作...您有围绕这部分的任何代码吗?
  • 没有。我注释掉了其他所有内容,它仍然给出了这个错误。
  • 即使开始和结束我都面临这个问题!
【解决方案5】:

在Mysql中,我们可以通过如下的set命令来声明和使用变量

mysql> set @foo="manjeet";
mysql> select * from table where name = @foo;

【讨论】:

    【解决方案6】:

    如果您使用 phpmyadmin 添加新例程,请不要忘记在 BEGIN 和 END 之间包装您的代码

    【讨论】:

      【解决方案7】:
      Declare @variable type(size);
      
      Set @variable = 'String' or Int ;
      

      例子:

       Declare @id int;
       set @id = 10;
      
       Declare @str char(50);
       set @str='Hello' ; 
      

      【讨论】: