Mysql 在表中插入变量和常量标记的串联

Mysql 在表中插入变量和常量标记的串联,mysql,concatenation,sql-insert,user-variables,Mysql,Concatenation,Sql Insert,User Variables,我有一个具有以下模式的表 CREATE TABLE `foo` ( `myfield` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 我定义了几个变量,如下所示 SET @NAME := 'Somename'; SET @AGE := '31'; 我需要在表中插入一个条目,该条目由这些用户定义变量和常量标记的串联组成。我尝试了以下查询 INSERT INTO `foo` (`myfield`) VALUES ('Name: ' +

我有一个具有以下模式的表

CREATE TABLE `foo` (
  `myfield` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我定义了几个变量,如下所示

SET @NAME := 'Somename';
SET @AGE := '31';
我需要在表中插入一个条目,该条目由这些用户定义变量和常量标记的串联组成。我尝试了以下查询

INSERT INTO `foo` (`myfield`) VALUES
('Name: ' + @NAME + ' Age: ' + @AGE);
语句执行成功,但插入后
myfield
等于:

31

就像插入值的第一部分被忽略一样。我错过了什么?

首先。阅读有关数据库规范化的内容。您希望存储姓名和年龄的方式是对SQL的严重误用。如果你将这样编写的应用程序传递给其他程序员,他们将诅咒你的名字直到第千代。真的

第二。MySQL中的
+
操作符执行加法。如果您使用
“任意字符串”+42
,则会发生两种情况:

  • MySQL看到它正在添加数字,并强制将“任意字符串”强制为一个数字:然后是数字零
  • 它把零和42相加

  • 您想先使用
    CONCAT('Name:'、@Name、'Age:'、@Age)

    。阅读有关数据库规范化的内容。您希望存储姓名和年龄的方式是对SQL的严重误用。如果你将这样编写的应用程序传递给其他程序员,他们将诅咒你的名字直到第千代。真的

    第二。MySQL中的
    +
    操作符执行加法。如果您使用
    “任意字符串”+42
    ,则会发生两种情况:

  • MySQL看到它正在添加数字,并强制将“任意字符串”强制为一个数字:然后是数字零
  • 它把零和42相加

  • 您希望使用
    CONCAT('Name:'、@Name、'Age:'、@Age)

    以下是您应该如何处理此类数据:

  • 你不希望明年你的年龄保持不变,所以你要存储出生日期
  • 插入时,每个字段存储一个信息
  • 在输出
    上选择
    you
    CONCAT
    所需内容
  • 因此:


    您应该如何处理此类数据:

  • 你不希望明年你的年龄保持不变,所以你要存储出生日期
  • 插入时,每个字段存储一个信息
  • 在输出
    上选择
    you
    CONCAT
    所需内容
  • 因此:


    +不是一个mysql字符串连接函数,使用concat动词。这很有效!谢谢@P.salmonth这是如何不在数据库中存储数据。。。请不要这样做…可能重复的+不是一个mysql字符串连接函数使用concat动词。这很有效!谢谢@P.salmonth这是如何不在数据库中存储数据。。。请不要这样做…可能的副本我已经自由编辑您的答案,并添加另一个解释完整的“好方法”。我已经自由编辑您的答案,并添加另一个解释完整的“好方法”。嗨,布拉格,感谢您的回复。年龄只是一个例子。实际情况与您在回答中描述的情况类似,只有常量(不变)值,如姓名或出生。目标只是将查询参数化。谢谢你的解释。嗨,布拉格,谢谢你的回复。年龄只是一个例子。实际情况与您在回答中描述的情况类似,只有常量(不变)值,如姓名或出生。目标只是将查询参数化。谢谢你的解释。
    CREATE TABLE `foo` (
        `NAME` text NOT NULL,
        `BIRTH` date NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    INSERT INTO `foo` (`NAME`, `BIRTH`)
    VALUES (@NAME, @BIRTH);
    
    
    SELECT CONCAT(
        'Name: ',
        `foo`.`NAME`,
        ' Age: ',
         TIMESTAMPDIFF(YEAR,`foo`.`BIRTH`,CURDATE())
         )
    FROM `foo`