#mysql #mysql-8.0
#mysql #mysql-8.0
Вопрос:
У меня есть представление, которое разработано следующим образом,
SELECT ('header1,header2,header3,header' ) as `line`
UNION ALL
SELECT DISTINCT CONCAT(column1,column2,column3,column4) as `line`
from mytables t
join table2 gc ON (gc.code = t.code)
where t.myfield = getId()
Функция getId() выглядит следующим образом,
DELIMITER $
CREATE FUNCTION `getId`() RETURNS varchar(30) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
NO SQL
DETERMINISTIC
return @bid$
DELIMITER ;
Чтобы отследить ошибку, я прошел процесс устранения, в ходе которого я воссоздал представление, удалив и добавив столбцы, и ошибка возникает, когда column4 добавляется в представление.
Определение таблицы для table2, из которой берется столбец 4, является,
CREATE TABLE `table2` (
`code` int NOT NULL,
`column4` varchar(100) NOT NULL
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Я использую следующий запрос для просмотра theview (где появляется ошибка «недопустимое сочетание сопоставлений для операции «ОБЪЕДИНЕНИЕ»),
SELECT distinct s.* FROM (SELECT @bid:='AB') parm, `theview` s;
Я использую функцию getId () в других представлениях, и я не получаю там ошибку.
Комментарии:
1. 1-й подзапрос в UNION использует параметры сортировки сервера для столбца, тогда как 2-й берет параметры сортировки из структуры таблицы. Похоже, они не являются принудительными. Укажите необходимую сортировку явно в запросе с неправильной. Например,
SELECT ('header1,header2,header3,header' ) COLLATE {latin1_???} as `line` UNION ..
2. Спасибо @Akina ! Добавлено сопоставление utf8mb4_unicode_ci к первому запросу в объединении, и похоже, что оно работает
Ответ №1:
В соответствии с предложением, полученным на вопрос, я добавил сопоставление utf8mb4_unicode_ci к первому запросу, поэтому запрос теперь выглядит так,
SELECT ('header1,header2,header3,header' ) collate utf8mb4_unicode_ci as `line`
Похоже, это сделало свое дело.
Комментарии:
1. это решает мою проблему, но я не понял смысла этого изменения, отличный ответ