Вставить в таблицу конкатенацию переменных и постоянных токенов

У меня есть таблица со следующей схемой

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

Это как первая часть вставленного значения игнорируется. Что мне не хватает?

2 ответа

Первый. Читайте о нормализации базы данных. То, как вы надеетесь сохранить имя и возраст, является ужасным неправильным использованием SQL. Если вы передадите свое приложение, написанное таким образом, другим программистам, они проклянут ваше имя тысячному поколению. Шутки в сторону.

Во-вторых. + Оператор в MySQL делает сложение. Если вы делаете 'any string' + 42происходят две вещи:

  1. MySQL видит, что это добавляет числа и принуждения 'any string' на номер: затем номер ноль.
  2. это добавляет ноль к 42.

Вы хотите использовать CONCAT('Name: ', @NAME, ' Age: ', @AGE)

Вот как вы должны иметь дело с такими данными:

  1. вы не хотите, чтобы ваш возраст был таким же в следующем году, поэтому вы сохраняете дату рождения
  2. когда вы вставляете, вы сохраняете одну информацию на поле
  3. на выходе SELECT вы CONCAT то, что ты хочешь.

Так:

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`
Другие вопросы по тегам