Вставить в таблицу конкатенацию переменных и постоянных токенов
У меня есть таблица со следующей схемой
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
происходят две вещи:
- MySQL видит, что это добавляет числа и принуждения
'any string'
на номер: затем номер ноль. - это добавляет ноль к 42.
Вы хотите использовать CONCAT('Name: ', @NAME, ' Age: ', @AGE)
Вот как вы должны иметь дело с такими данными:
- вы не хотите, чтобы ваш возраст был таким же в следующем году, поэтому вы сохраняете дату рождения
- когда вы вставляете, вы сохраняете одну информацию на поле
- на выходе
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`