utf8_unicode_ci - Ungültiger Mix von Kollatierungsfehlern in MySql




mysql collation implicit (12)

Ü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.

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 - Unzulässige Mischung von 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


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


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

Bei der A0- Konvertierung bekam ich 160, aber 160 befand sich außerhalb des Bereichs des Zeichens, das db kennt. Deshalb kann die Datenbank es nicht als Zeichen erkennen. Eine andere Sache ist, dass meine Tabellenspalte varchar ist

  • 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);


Ich habe das gleiche 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, wodurch das Erfassungsproblem behoben wird.


Ich habe denselben Fehler in einer gespeicherten Prozedur, in der where-Klausel. 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.


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, 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!


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


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

Link


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


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.


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

aber warum ich antworte, hast du mich nicht als richtige Antwort gewählt :)


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;




mysql-error-1267