【问题标题】:Insert into table concatenation of variables and constant tokens插入变量和常量标记的连接表
【发布时间】:2017-11-12 11:43:54
【问题描述】:

我有一个具有以下架构的表

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

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

【问题讨论】:

  • + 不是 mysql 字符串连接函数使用 concat 动词。
  • 成功了!谢谢@P.Salmon
  • 这是在数据库中存储数据的方式...请不要这样做...

标签: mysql concatenation sql-insert user-variables


【解决方案1】:

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

第二。 MySQL 中的 + 运算符会进行加法运算。如果你这样做'any string' + 42,会发生两件事:

  1. MySQL 发现它正在添加数字并强制 'any string' 到一个数字:然后数字为零。
  2. 它将 0 添加到 42。

你想使用CONCAT('Name: ', @NAME, ' Age: ', @AGE)

【讨论】:

  • 我冒昧地编辑了您的答案,并添加了另一个解释完整“好方法”的答案。
【解决方案2】:

你应该如何处理这种数据:

  1. 你不希望你明年的年龄一样,所以你存储出生日期
  2. 插入时,每个字段存储一个信息
  3. 在输出SELECTCONCAT你想要什么。

所以:

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`

【讨论】:

  • 嗨,布拉格,感谢您的回复。年龄只是一个例子。真实情况类似于您在此答案中描述的情况,只有恒定(不变)值,例如姓名或出生。目标只是对查询进行参数化。谢谢你的解释。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2012-04-19
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多