2009-08-06 12 views
32

Właśnie otrzymałem tę odpowiedź z poprzedniego pytania i działa to naprawdę dobrze!Nielegalna mieszanka błędu sortowania w 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 

Ale kiedy trzymać ten dodatkowy kawałek w nim daje ten błąd:

Documentation #1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '='

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 

tabeli jest:

id, username, rating, month

Odpowiedz

13

sprawdzić typ sortowania każdej tabeli i upewnij się, że mają ten sam sortowanie.

Następnie sprawdź również typ sortowania każdego pola tabeli, z którego korzystasz.

Napotkałem ten sam błąd i te sztuczki działają na mnie.

-2

Upewnij się, że wersja podpór MySQL podzapytania (4.1+). Następnie można spróbować przepisywanie zapytanie do czegoś takiego:

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 
+0

przy okazji, czy Twoja kolumna users.gender ma typ int? – stereoscott

+0

Próbowałem tego: SELECT ocena .username, (SUMA (oceny.rating)/COUNT (*)) jako TheAverage, Count (*) jako TheCount FROM ocen, użytkowników WHERE ratings.month = "Aug" i ratings.username = users.username AND users.gender = 1 GROUP BY ratingss.username HAVING TheCount> 4 ORDER BY TheAverage DESC, TheCount DESC Masz ten sam błąd co poprzednio? Tak, płeć to int. – Oliver

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

ale dlaczego ja odpowiadam, dont głosowali mi jako właściwą odpowiedź :)

+0

Cześć Już wypróbowałem to w ten sposób i dostałem ten sam błąd! – Oliver

+0

Ok Widzę znać błąd, który opublikujesz w komentarzu. czy błąd nie mówi wszystkiego? Twoje tabele lub pola mają mieszane sortowanie. zmieniono to tak, aby wszystkie tabele/pola miały taką samą sortowanie. – Rufinus

+0

btw. naprawdę powinieneś użyć sprzężenia, jak sugeruje to stereointeractive.com, twoje podkwerendy są wykonywane dla każdego wiersza, który jest trochę powolny. zobacz także http://dev.mysql.com/doc/refman/5.0/en/optimizing-subqueries.html – Rufinus

1
  • Sprawdź, czy users.gender kolumna to INTEGER.
  • Spróbuj: alter table users convert to character set latin1 collate latin1_swedish_ci;
0
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; 
64

Oto jak sprawdzić, które kolumny są źle sortowania:

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; 

A oto zapytanie go naprawić:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET latin1 COLLATE 'latin1_swedish_ci'; 

Link

+0

Dzięki, to uratowało mój dzień! – rahimv

1

Musisz zmienić każdy Sortowanie kolumna z latin1_general_ci na latin1_swedish_ci

4

ja otrzymuję ten sam błąd na phpMyAdmin a nie rozwiązanie wskazano tutaj który pracował dla mnie

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

Illegal mix of collations MySQL Error Również polecam pójście z Generalną zamiast szwedzki ponieważ jeden jest domyślny i nie używać języka chyba że twoja aplikacja używa szwedzkiego.

1

Mam ten sam błąd w procedurze przechowywanej, w klauzuli where. odkryłem, że problem wystąpił z lokalną zadeklarowaną zmienną, poprzednio ładowaną przez tę samą tabelę/kolumnę.

Rozwiązałem to, przesyłając dane do pojedynczego znaku.

1

W skrócie, ten błąd jest spowodowany przez próbę wykonania operacji MySQL na dwóch elementach, które mają różne ustawienia sortowania. Jeśli dopasujesz ustawienia, błąd zniknie.Oczywiście, musisz wybrać odpowiednie ustawienie dla swojej bazy danych, w zależności od tego, do czego będzie ona używana.

Oto kilka dobrych rad na temat wyboru pomiędzy dwoma bardzo często utf8 sortowania: What's the difference between utf8_general_ci and utf8_unicode_ci

Jeśli używasz phpMyAdmin można to zrobić systematycznie pracując przez tabel wymienionych w komunikacie o błędzie, a także sprawdzanie typ sortowania dla każdego kolumna. Najpierw powinieneś sprawdzić, jakie jest ogólne ustawienie sortowania dla twojej bazy danych - phpMyAdmin może ci to powiedzieć i zmienić jeśli to konieczne. Ale każda kolumna w każdej tabeli może mieć własne ustawienie. Zazwyczaj będziesz chciał, aby wszystkie te pasowały do ​​siebie.

W małej bazie danych jest to łatwe do zrobienia ręcznie, aw każdym razie, jeśli przeczytałeś komunikat o błędzie w całości, zwykle wskaże Ci to właściwe miejsce. Nie zapomnij przyjrzeć się ustawieniom "struktury" kolumn z podtabeli. Po znalezieniu sortowania, które nie pasuje, można go zmienić za pomocą phpMyAdmin bezpośrednio, bez konieczności korzystania z okna zapytania. Następnie spróbuj ponownie wykonać operację. Jeśli błąd będzie się powtarzał, szukaj dalej!

1

myślę, że należy przekonwertować na 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 
6

[MySQL]

W tych (bardzo rzadko) przypadkach:

  • dwie tabele, które naprawdę potrzebują różnych rodzajów sortowania
  • wartości nie pochodzące z tabeli, ale z jawnego wyliczenia, na przykład:

    SELECT 1 AS numery UNION ALL SELECT 2 UNION ALL SELECT 3

można porównać wartości między różnymi tabelami za pomocą CAST lub CONVERT:

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

CONVERT('my text' USING utf8) 

Zobacz CONVERT and CAST documentation na stronie MySQL.

+0

Nie są tak rzadkie, często dostaję je na naszej wielojęzycznej stronie. –

0

Problemem tutaj głównie, podobnie jak pole Obsada tej obsadzie (pole jako varchar) lub obsada (pola jak data)

0

Zastosowanie ascii_bin gdzie to możliwe, będzie dopasować się z niemal każdym zestawień. Nazwa użytkownika i tak rzadko akceptuje znaki specjalne.

0

Jeśli chcesz uniknąć zmiany składni, aby rozwiązać ten problem, spróbuj tego:

zaktualizować swój MySQL w wersji 5.5 lub wyższej.

Rozwiązało to problem dla mnie.

+0

To może nie być prawda. Mam wersję 5.6.35 i nadal otrzymuję ten błąd –

0

Mam taki sam problem z ostrzeżeniem o zbiorach dla pola, które jest ustawione od 0 do 1. Wszystkie zbiory kolumn były takie same. Próbujemy ponownie zmienić kolekcje, ale nic nie rozwiązuje tego problemu.

Na końcu aktualizujemy pole do NULL, a następnie aktualizujemy do 1, co eliminuje problem z pobieraniem.

Powiązane problemy