2009-08-06 6 views
32

Habe gerade diese Antwort von einer vorherigen Frage und es funktioniert ein Vergnügen!Illegale Mischung von Kollationen Fehler in 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 

Aber als ich diese Extra darin kleben gibt diesen Fehler:

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 

Der Tisch ist:

id, username, rating, month

Antwort

13

Überprüfen Sie den Überprüfungstyp jeder Tabelle, und stellen Sie sicher, dass sie die gleiche Zusammenstellung haben.

Danach überprüfen Sie auch den Kollationstyp jedes Tabellenfelds, das Sie im Betrieb verwenden.

Ich hatte den gleichen Fehler, und dass Tricks auf mich funktioniert.

-2

Stellen Sie sicher, Ihre Version von MySQL unterstützt Unterabfragen (4.1+). Als nächstes könnten Sie versuchen, Ihre Frage zu so etwas wie dieses Umschreiben:

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

Übrigens, ist Ihre Spalte users.gender ein Int-Typ? – stereoscott

+0

Ich habe das versucht: SELECT ratings.username, (SUM (Bewertungen.Bewertung)/COUNT (*)) als TheAverage, Count (*) als TheCount aus Bewertungen, Benutzer WHERE ratings.month = 'Aug' und ratings.username = users.username UND users.gender = 1 GROUP BY ratings.username HAVING TheCount> 4 ORDER BY TheAverage DESC, TheCount DESC Haben Sie den gleichen Fehler wie zuvor? Ja, Geschlecht ist ein Int. – Oliver

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

aber, warum ich beantworten, tragen

Sie wählten mich als richtige Antwort :)
+0

Hallo ich habe es schon so probiert und habe den gleichen Fehler bekommen! – Oliver

+0

ok Ich sehe den Fehler, den Sie in den Kommentar geschrieben haben. sagt der Fehler nicht alles? Ihre Tabellen oder Felder haben eine gemischte Sortierung. änderte es, so dass alle Tabellen/Felder die gleiche Sortierung haben. – Rufinus

+0

btw. Sie sollten wirklich einen Join verwenden, wie von stereointeractive.com vorgeschlagen. Ihre Unterabfrage wird für jede Zeile ausgeführt, die irgendwie langsam ist. siehe auch http://dev.mysql.com/doc/refman/5.0/en/optimizing-subqueries.html – Rufinus

1
  • überprüfen, ob Ihre users.gender Spalte ist ein INTEGER.
  • Versuchen: 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

Hier ist, wie zu überprüfen, welche Spalten die falsche Kollation:

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; 

Und hier ist die Abfrage, es zu beheben:

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

Link

+0

Danke, das hat meinen Tag gerettet! – rahimv

1

Sie benötigen jede Spalte Sortierungs ändern von latin1_general_ci zu latin1_swedish_ci

4

Ich war immer den gleichen Fehler auf PhpMyadmin und hat hier die Lösung angegeben, die

für mich gearbeitet
ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

Illegal mix of collations MySQL Error Auch da würde ich empfehlen, mit General statt schwedischen gehen, dass ein Standard ist und nicht die Sprache zu verwenden es sei denn, Ihre Anwendung verwendet Schwedisch.

1

Ich habe den gleichen Fehler innerhalb einer gespeicherten Prozedur in der Where-Klausel. Ich entdeckte, dass das Problem mit einer lokalen deklarierten Variablen auftrat, die zuvor von derselben Tabelle/Spalte geladen wurde.

Ich löste es die Casting-Daten auf einzelne Char-Typ.

1

Kurz gesagt, dieser Fehler wird von MySQL verursacht, der versucht, eine Operation an zwei Dingen durchzuführen, die unterschiedliche Sortiereinstellungen haben. Wenn Sie die Einstellungen übereinstimmen, wird der Fehler verschwinden.Natürlich müssen Sie die richtige Einstellung für Ihre Datenbank auswählen, je nachdem, wofür sie verwendet wird.

Hier ist eine gute Beratung zwischen zwei sehr häufig utf8 Sortierungen Auswahl: What's the difference between utf8_general_ci and utf8_unicode_ci

Wenn Sie phpMyAdmin verwenden Sie können dies systematisch tun, indem Sie arbeiten durch die Tabellen in der Fehlermeldung erwähnt, und die Überprüfung der Art Sortierung für jede Säule. Zuerst sollten Sie überprüfen, welches die Sortiereinstellung für Ihre Datenbank ist - phpMyAdmin kann Ihnen dies mitteilen und bei Bedarf ändern. Aber jede Spalte in jeder Tabelle kann ihre eigene Einstellung haben. Normalerweise möchten Sie alle diese übereinstimmen.

In einer kleinen Datenbank ist dies leicht von Hand zu erledigen, und in jedem Fall, wenn Sie die Fehlermeldung vollständig lesen, wird es Sie normalerweise an den richtigen Ort verweisen. Vergessen Sie nicht, sich auch die 'Struktur' Einstellungen für Spalten mit Untertabellen anzusehen. Wenn Sie eine Kollatierung finden, die nicht übereinstimmt, können Sie sie direkt mit phpMyAdmin ändern, ohne dass Sie das Abfragefenster verwenden müssen. Dann versuchen Sie es erneut. Wenn der Fehler weiterhin besteht, suchen Sie weiter!

1

Ich denke, Sie sollten

--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]

In diesen (sehr seltenen) Fällen in UTF8 konvertieren:

  • zwei Tabellen, die wirklich brauchen andere Sortierung Typen
  • Werte stammen nicht von einer Tabelle, sondern von einer expliziten Aufzählung, zum Beispiel:

    SELECT 1 AS-Nummern UNION ALL SELECT 2 UNION ALL SELECT 3

Sie die Werte zwischen den verschiedenen Tabellen unter Verwendung von CAST oder CONVERT vergleichen kann:

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

CONVERT('my text' USING utf8) 

Siehe CONVERT and CAST documentation auf MySQL-Website.

+0

Sie sind nicht so selten, ich bekomme sie ziemlich häufig auf unserer mehrsprachigen Seite. –

0

Das Problem ist hier vor allem, Guss gerade das Feld wie dieser Besetzung (Feld als varchar) oder gegossen (Felder als Datum)

0

Verwendung ascii_bin, wo immer es möglich ist, sie mit fast jedem Sortierungszusammenpassen wird. Ein Benutzername akzeptiert selten Sonderzeichen.

0

Wenn Sie vermeiden möchten, Syntax zu ändern, dieses Problem zu lösen, versuchen Sie dies:

Aktualisieren Sie Ihre MySQL-Version 5.5 oder höher.

Das löste das Problem für mich.

+0

Dies ist möglicherweise nicht wahr. Ich habe Version 5.6.35 und bekomme immer noch diesen Fehler –

0

Ich habe das gleiche Problem mit Sammlungswarnung für ein Feld, das von 0 bis 1 festgelegt ist. Alle Spalten Sammlungen war die gleiche. Wir versuchen, die Sammlungen erneut zu ändern, aber nichts behebt dieses Problem.

Am Ende aktualisieren wir das Feld auf NULL und danach aktualisieren wir auf 1 und dies löst das Sammelproblem.