Код ошибки: 1271. Недопустимое сочетание параметров сортировки для операции «ОБЪЕДИНЕНИЕ» в mysql

#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. это решает мою проблему, но я не понял смысла этого изменения, отличный ответ