Data truncation: Data too long for column 'chain_of_ids' at row 1
MYSQL 8+ версии
Есть таблица для рекурсивного запроса id,name,parentId
Максимальный уровень вложенности 8
Искал в интернете как решить эту проблему - все говорят увеличить размерность поля существующей таблицы, но в моём запросе таблицы не существует на жестком диске. Ошибка в том что во втором выражении получается слишком длинная строка, НО! я пробовал
менять CONCAT(id,'') на CONCAT(id,'___________________________________________________')
И CONCAT(at.chain_of_ids,',',c.id) на CONCAT(at.chain_of_ids,',') - это работает без ошибки, хотя строка получается намного длинней чем ожидается от изначального запроса,
также я натыкаюсь на эту ошибку если менять CONCAT(at.chain_of_ids,',',c.id) на CONCAT(at.chain_of_ids,',_')
WITH RECURSIVE `accumulation_table` AS (
SELECT `id`,`name`, CONCAT(`id`,'') AS `chain_of_ids` FROM `Category` WHERE `parentId` = 0
UNION ALL
SELECT c.`id`,c.`name`, CONCAT(at.`chain_of_ids`,',',c.`id`) AS `chain_of_ids`
FROM `Category` c
JOIN `accumulation_table` at ON at.id=c.parentId
)
SELECT * FROM `accumulation_table` a
Ответы (1 шт):
В первой части запроса используйте явное указание типа и длины данных для поля. С помощью cast(id as char(100)). Если этого не сделать, то MySQL пытается понять используемый тип данных автоматически. Строковые функции на подобии concat() или строки фиксированной длины сообщают MySQL тип данных char с минимально возможной длиной. Т.е. для id=10 он выдаст после преобразования тип char(2). Во второй части запроса MySQL уже не меняет выбранный тип данных и пытается добавлять новые символы к короткой строке, что вызывает переполнение.