webentwicklung-frage-antwort-db.com.de

Ungültiger Mix von Kollatierungsfehlern in MySql

Habe gerade diese Antwort aus einer vorherigen Frage erhalten und es ist ein Vergnügen!

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 wenn ich dieses zusätzliche Bit stecke, wird dieser Fehler angezeigt:

Dokumentation # 1267 - Ungültige Mischung aus Kollatierungen (latin1_swedish_ci, IMPLICIT) und (latin1_general_ci, IMPLICIT) für 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

Die Tabelle ist:

id, username, rating, month

38
Oliver

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

Überprüfen Sie anschließend auch den Sortierungstyp jedes Tabellenfelds, das Sie in Betrieb haben.

Ich war auf den gleichen Fehler gestoßen, und diese Tricks funktionieren bei mir.

14
1mr3yn

So prüfen Sie, welche Spalten die falsche Sortierung sind:

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, um das Problem zu beheben:

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

Verknüpfung

72
Dean Rather

[MySQL]

In diesen (sehr seltenen) Fällen:

  • zwei Tabellen, die wirklich unterschiedliche Sortierarten benötigen
  • werte, die nicht aus einer Tabelle stammen, sondern aus einer expliziten Aufzählung stammen, z.

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

sie können die Werte zwischen den verschiedenen Tabellen mit CAST oder CONVERT vergleichen:

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

CONVERT('my text' USING utf8)

Siehe CONVERT und CAST-Dokumentation auf der MySQL-Website.

11
RotS

Ich habe bei PhpMyadmin den gleichen Fehler erhalten und die hier angegebene Lösung für mich gefunden

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

Unzulässige Mischung von Sortierungen MySQL-Fehler Außerdem würde ich empfehlen, mit General anstelle von Schwedisch zu gehen, da diese Standardeinstellung ist und die Sprache nicht verwendet wird, es sei denn, Ihre Anwendung verwendet Schwedisch.

5
pal4life
  • Stellen Sie sicher, dass Ihre Users.gender-Spalte ein INTEGER ist.
  • Versuchen Sie: alter table users convert to character set latin1 collate latin1_swedish_ci;
1
hobodave

Ich habe diesen Fehler in einer gespeicherten Prozedur in der where-Klausel erhalten. Ich entdeckte, dass das Problem bei einer lokal deklarierten Variablen auftrat, die zuvor von derselben Tabelle/Spalte geladen wurde.

Ich habe es aufgelöst und die Daten in einen einzelnen Zeichentyp umgewandelt.

1
Roberto Camargo

Das Problem hier hauptsächlich, Cast das Feld wie dieser Cast (Feld als Varchar) oder Cast (Felder als Datum)

1
reds

Ich denke, du solltest zu utf8 konvertieren

--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
1
Quy Le

Kurz gesagt, dieser Fehler wird dadurch verursacht, dass MySQL versucht, eine Operation mit zwei Dingen durchzuführen, die unterschiedliche Sortierungseinstellungen haben. Wenn Sie die Einstellungen anpassen, wird der Fehler behoben. Natürlich müssen Sie die richtige Einstellung für Ihre Datenbank auswählen, je nachdem, wofür sie verwendet wird. 

Hier ein paar gute Ratschläge zur Wahl zwischen zwei sehr häufigen utf8-Kollatierungen: Was ist der Unterschied zwischen utf8_general_ci und utf8_unicode_ci

Wenn Sie phpMyAdmin verwenden, können Sie dies systematisch tun, indem Sie die in Ihrer Fehlermeldung genannten Tabellen durcharbeiten und den Sortierungstyp für jede Spalte überprüfen. Zuerst sollten Sie überprüfen, welche allgemeine Einstellung für die Kollatierung für Ihre Datenbank festgelegt ist. PhpMyAdmin kann Ihnen dies mitteilen und gegebenenfalls ändern. Jede Spalte in jeder Tabelle kann jedoch ihre eigene Einstellung haben. Normalerweise möchten Sie, dass alle übereinstimmen. 

In einer kleinen Datenbank ist dies leicht genug von Hand auszuführen. Wenn Sie die Fehlermeldung vollständig lesen, werden Sie in der Regel an den richtigen Ort geleitet. Vergessen Sie nicht, auch die "Struktur" -Einstellungen für Spalten mit Untertabellen zu betrachten. Wenn Sie eine Kollatierung finden, die nicht übereinstimmt, können Sie sie mit phpMyAdmin direkt ändern. Das Abfragefenster muss nicht verwendet werden. Dann versuchen Sie es erneut. Bleibt der Fehler bestehen, schauen Sie weiter!

1
Pinkeye

Sie müssen jede Spalte Sortierung von latin1_general_ci in latin1_swedish_ci ändern

1
Swadesh

Ich habe auch den gleichen Fehler erhalten, aber in meinem Fall lag das Hauptproblem in der Bedingung wo. Der Parameter, den ich überprüfe, hatte ein unbekanntes verstecktes Zeichen (+% A0).

Wenn A0 convert 160 bekam, aber 160 außerhalb des Bereichs des Zeichens war, das von db erkannt wird, kann die Datenbank es nicht als Zeichen erkennen 

  • die Lösung, die ich gemacht habe, war, dass ich einige dieser Zeichen überprüft habe und diese entfernt, bevor der SQL-Befehl ausgeführt wird 

  • ex: - preg_replace ('/\D /', '', $ myParameter);

1
kaushi

Verwenden Sie ascii_bin, wo immer dies möglich ist, es wird mit fast jeder Sortierung verglichen. Ein Benutzername akzeptiert ohnehin selten Sonderzeichen.

0
Kjeld Flarup

Ich habe dasselbe Problem mit der Sammlungswarnung für ein Feld, das von 0 auf 1 gesetzt ist. Alle Spaltensammlungen waren gleich. Wir versuchen erneut, die Sammlungen zu ändern, aber dieses Problem wird durch nichts behoben.

Am Ende aktualisieren wir das Feld auf NULL und danach aktualisieren wir auf 1 und das Sammlungsproblem wird dadurch behoben.

0
glg
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;
0
Quassnoi

Sie müssen 'utf8' für alle Parameter in jeder Funktion einstellen. Es ist mein Fall:

Bildbeschreibung hier eingeben

0
Nhung Phan

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

Aktualisieren Sie Ihr MySQL auf Version 5.5 oder höher.

Dies hat das Problem für mich gelöst.

0
HoldOffHunger