Подтвердить что ты не робот

Недопустимое смешение ошибок сортировки в 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

4b9b3361

Ответ 1

Проверьте тип сортировки для каждой таблицы и убедитесь, что они имеют одинаковую сортировку.

После этого проверьте также тип сортировки для каждого поля таблицы, которое вы используете в работе.

Я столкнулся с той же ошибкой, и эти трюки работают на меня.

Ответ 2

Здесь, как проверить, какие столбцы являются неправильной сортировкой:

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';

Ссылка

Ответ 3

[MySQL]

В этих (очень редких) случаях:

  • две таблицы, которые действительно нуждаются в разных типах сортировки
  • значения не поступают из таблицы, а из явного перечисления, например:

    SELECT 1 AS numbers UNION ALL SELECT 2 UNION ALL SELECT 3

вы можете сравнить значения между разными таблицами с помощью CAST или CONVERT:

CAST('my text' AS CHAR CHARACTER SET utf8)

CONVERT('my text' USING utf8)

Смотрите документацию CONVERT и CAST на веб-сайте MySQL.

Ответ 4

Я получал такую ​​же ошибку на PhpMyadmin и сделал здесь указанное решение, которое сработало для меня

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

Нелегальное сочетание коллизий Ошибка MySQL Также я бы порекомендовал переходить с генералом вместо шведского, так как он по умолчанию и не использует язык, если ваше приложение не использует шведский язык.

Ответ 5

  • Убедитесь, что столбец users.gender является INTEGER.
  • Попробуйте: alter table users convert to character set latin1 collate latin1_swedish_ci;

Ответ 6

Вам нужно изменить каждый столбец Collation с latin1_general_ci на latin1_swedish_ci

Ответ 7

Я получил ту же ошибку внутри хранимой процедуры, в предложении where. я обнаружил, что проблема возникла с локальной объявленной переменной, ранее загруженной той же таблицей/столбцом.

Я решил, что он лидирует данные в один тип char.

Ответ 8

Короче говоря, эта ошибка вызвана тем, что MySQL пытается выполнить операцию над двумя вещами, которые имеют разные настройки сортировки. Если вы настроите настройки, ошибка исчезнет. Конечно, вам нужно выбрать правильную настройку для вашей базы данных, в зависимости от того, для чего она будет использоваться.

Вот несколько хороших советов по выбору между двумя очень распространенными сортировками utf8: В чем разница между utf8_general_ci и utf8_unicode_ci

Если вы используете phpMyAdmin, вы можете сделать это систематически, выполнив таблицы, указанные в вашем сообщении об ошибке, и проверите тип сортировки для каждого столбца. Сначала вы должны проверить, какой общий параметр сортировки для вашей базы данных - phpMyAdmin может рассказать вам об этом и при необходимости изменить его. Но каждый столбец в каждой таблице может иметь свою собственную настройку. Обычно вам нужно, чтобы все это соответствовало.

В небольшой базе данных это достаточно легко сделать вручную, и в любом случае, если вы прочитаете сообщение об ошибке в полном объеме, оно обычно укажет вам нужное место. Не забудьте также посмотреть настройки "структуры" для столбцов с субтитрами. Когда вы найдете сопоставление, которое не соответствует, вы можете изменить его напрямую с помощью phpMyAdmin, не нужно использовать окно запроса. Затем повторите попытку. Если ошибка сохраняется, продолжайте искать!

Ответ 9

Я думаю, вам нужно преобразовать в 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

Ответ 10

Проблема здесь в основном, просто вставьте поле, подобное этому приложению (поле как varchar) или cast (поля как дата)

Ответ 11

Я также получил ту же ошибку, но в моем случае основная проблема была в том, где условие, что параметр, который я проверяю, имел какой-то неизвестный скрытый символ (+% A0)

Когда A0 преобразовал, я получил 160, но 160 был вне диапазона символа, который знает db, поэтому, почему база данных не может распознать его как символ, другая вещь - моя колонка таблицы varchar

  • Решение, которое я сделал, я проверил, есть некоторые символы, как это и удалить их, прежде чем запустить команду SQL

  • например: - preg_replace ('/\ D/', '', $ myParameter);

Ответ 12

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;

Ответ 13

Используйте ascii_bin, где это возможно, оно будет соответствовать почти любому сопоставлению. Имя пользователя редко принимает специальные символы.

Ответ 14

Если вы хотите избежать изменения синтаксиса для решения этой проблемы, попробуйте следующее:

Обновите свой MySQL до версии 5.5 или выше.

Это разрешило проблему для меня.

Ответ 15

У меня такая же проблема с предупреждением коллекции для поля, которое установлено от 0 до 1. Все коллекции колонок были одинаковыми. Мы снова пытаемся изменить коллекции, но ничего не исправляем.

В конце мы обновляем поле до NULL, а затем обновляем до 1, и это устраняет проблему сбора.

Ответ 17

HAvING TheCount > 4 AND username IN (SELECT username FROM users WHERE gender=1)

но почему я отвечаю, вы не проголосовали за меня как правильный ответ:)

Ответ 18

Убедитесь, что ваша версия 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