Неверное смешение параметров сортировки в MySql
Только что получил ответ от предыдущего вопроса, и это работает удовольствие!
SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount
FROM ratings WHERE month='Aug' GROUP BY username HAVING TheCount > 4
ORDER BY TheAverage DESC, TheCount DESC
Но когда я вставляю этот дополнительный бит, он выдает эту ошибку:
Документация #1267 - Недопустимое сочетание параметров сортировки (latin1_swedish_ci,IMPLICIT) и (latin1_general_ci,IMPLICIT) для операции '='
SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM
ratings WHERE month='Aug'
**AND username IN (SELECT username FROM users WHERE gender =1)**
GROUP BY username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC
Таблица является:
id, username, rating, month
21 ответ
Проверьте тип сопоставления каждой таблицы и убедитесь, что они имеют одинаковое сопоставление.
После этого проверьте также тип сортировки каждого поля таблицы, которое вы используете в работе.
Я столкнулся с той же ошибкой, и эта хитрость работает на меня.
Вот как проверить, какие столбцы имеют неправильное сопоставление:
SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE collation_name = 'latin1_general_ci'
ORDER BY table_schema, table_name,ordinal_position;
И вот запрос, чтобы это исправить:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET latin1 COLLATE 'latin1_swedish_ci';
[MySQL]
В этих (очень редких) случаях:
- две таблицы, которые действительно нуждаются в разных типах сортировки
значения не из таблицы, а из явного перечисления, например:
ВЫБЕРИТЕ 1 КАК НОМЕРА СОЮЗ ВСЕ ВЫБРАТЬ 2 СОЮЗ ВСЕ ВЫБРАТЬ 3
Вы можете сравнить значения между различными таблицами, используя CAST или CONVERT:
CAST('my text' AS CHAR CHARACTER SET utf8)
CONVERT('my text' USING utf8)
См. Документацию CONVERT и CAST на веб-сайте MySQL.
Я получил эту же ошибку на PhpMyadmin и сделал решение, указанное здесь, который работал для меня
ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
Неверное сочетание параметров сортировки Ошибка MySQL Также я бы порекомендовал перейти на General вместо шведского, поскольку этот язык используется по умолчанию, и не использовать язык, если ваше приложение не использует шведский.
Я думаю, что вы должны конвертировать в UTF8
--set utf8 for connection
SET collation_connection = 'utf8_general_ci'
--change CHARACTER SET of DB to utf8
ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci
--change CHARACTER SET of table to utf8
ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
Я также получил ту же ошибку, но в моем случае главная проблема была в том, где условие, что параметр, который я проверяю, имел некоторый неизвестный скрытый символ (+% A0)
Когда A0 преобразовал, я получил 160, но 160 был вне диапазона символа, который знает db, поэтому база данных не может распознать его как символ, иначе моя колонка таблицы varchar
Решение, которое я сделал, я проверил, есть некоторые символы, как это и удалить их, прежде чем запустить команду SQL
например:- preg_replace('/\D/', '', $myParameter);
Проблема здесь, в основном, просто приведение поля как этот приведение (поле как varchar) или приведение (поля как дата)
Вам нужно изменить каждый столбец Collation с latin1_general_ci на latin1_swedish_ci
Я получил эту же ошибку внутри хранимой процедуры, в предложении where. я обнаружил, что проблема возникла с локальной объявленной переменной, ранее загруженной той же таблицей / столбцом.
Я решил привести данные к одному типу символов.
Короче говоря, эта ошибка вызвана тем, что MySQL пытается выполнить операцию над двумя вещами, которые имеют разные параметры сортировки. Если вы сделаете настройки совпадают, ошибка исчезнет. Конечно, вам нужно выбрать правильную настройку для вашей базы данных, в зависимости от того, для чего она будет использоваться.
Вот несколько полезных советов по выбору между двумя очень распространенными сопоставлениями utf8: в чем разница между utf8_general_ci и utf8_unicode_ci
Если вы используете phpMyAdmin, вы можете делать это систематически, работая с таблицами, упомянутыми в вашем сообщении об ошибке, и проверяя тип сортировки для каждого столбца. Сначала вы должны проверить, какой общий параметр сортировки для вашей базы данных - phpMyAdmin может сообщить вам об этом и изменить его при необходимости. Но каждый столбец в каждой таблице может иметь свои собственные настройки. Обычно вы хотите, чтобы все это соответствовало.
В небольшой базе данных это достаточно легко сделать вручную, и в любом случае, если вы полностью прочитаете сообщение об ошибке, оно обычно укажет вам правильное место. Не забудьте также взглянуть на настройки структуры для столбцов с подтаблицами. Если вы обнаружите, что сопоставление не соответствует, вы можете изменить его с помощью phpMyAdmin напрямую, не нужно использовать окно запроса. Затем попробуйте снова. Если ошибка не устранена, продолжайте искать!
У меня была эта проблема не потому, что я храню в разных сопоставлениях, а потому, что мой тип столбца - JSON, который является двоичным.
Исправил вот так:
select table.field COLLATE utf8mb4_0900_ai_ci AS fieldName
- Убедитесь, что ваш столбец users.gender является INTEGER.
- Пытаться:
alter table users convert to character set latin1 collate latin1_swedish_ci;
Если вы хотите избежать изменения синтаксиса для решения этой проблемы, попробуйте это:
Обновите MySQL до версии 5.5 или выше.
Это решило проблему для меня.
Вам необходимо установить utf8 для всех параметров в каждой функции. Это мой случай:
Используйте ascii_bin везде, где это возможно, это будет соответствовать практически любому сопоставлению. В любом случае имя пользователя редко принимает специальные символы.
Получал недопустимое сочетание сопоставлений при создании категории в Багисто. Выполнение этих команд (спасибо @Quy Le) решило проблему для меня:
- установить utf8 для подключения
SET collation_connection = 'utf8_general_ci'
--изменить НАБОР СИМВОЛОВ БД на utf8
ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci
- изменить таблицы категорий
ALTER TABLE categories CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE category_translations CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
У меня та же проблема с предупреждением коллекции для поля, которое установлено от 0 до 1. Все коллекции столбцов были одинаковыми. Мы пытаемся снова изменить коллекции, но ничего не решаем.
В конце мы обновляем поле до NULL
и после этого мы обновляем до 1, и это преодолевает проблему сбора.
В моем случае это было что-то странное. Я читаю ключ api из файла, а затем отправляю его на сервер, где выполняется SQL-запрос. Проблема заключалась в символе спецификации, который оставил блокнот Windows, он вызывал ошибку, которая гласила:
SQLSTATE[HY000]: общая ошибка: 1267 Недопустимое сочетание параметров сортировки (latin1_swedish_ci, IMPLICIT) и (utf8_general_ci, COERCIBLE) для операции '='
Я просто удалил его и все заработало как шарм
SELECT username, AVG(rating) as TheAverage, COUNT(*) as TheCount
FROM ratings
WHERE month='Aug'
AND username COLLATE latin1_general_ci IN
(
SELECT username
FROM users
WHERE gender = 1
)
GROUP BY
username
HAVING
TheCount > 4
ORDER BY
TheAverage DESC, TheCount DESC;
HAvING TheCount > 4 AND username IN (SELECT username FROM users WHERE gender=1)
но почему я отвечаю, вы не проголосовали за меня как за правильный ответ:)
Убедитесь, что ваша версия MySQL поддерживает подзапросы (4.1+). Затем вы можете попробовать переписать ваш запрос примерно так:
SELECT ratings.username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM ratings, users
WHERE ratings.month='Aug' and ratings.username = users.username
AND users.gender = 1
GROUP BY ratings.username
HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC