Fehlermeldung auf MySql:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
Ich habe mehrere andere Beiträge durchgesehen und konnte dieses Problem nicht lösen. Der betroffene Teil ist ungefähr so:
CREATE TABLE users (
userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
firstName VARCHAR(24) NOT NULL,
lastName VARCHAR(24) NOT NULL,
username VARCHAR(24) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (userid)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE products (
productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(104) NOT NULL,
picturePath VARCHAR(104) NULL,
pictureThumb VARCHAR(104) NULL,
creationDate DATE NOT NULL,
closeDate DATE NULL,
deleteDate DATE NULL,
varPath VARCHAR(104) NULL,
isPublic TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
PRIMARY KEY (productID)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE productUsers (
productID INT UNSIGNED NOT NULL,
userID INT UNSIGNED NOT NULL,
permission VARCHAR(16) NOT NULL,
PRIMARY KEY (productID,userID),
FOREIGN KEY (productID) REFERENCES products (productID) ON DELETE RESTRICT ON UPDATE NO ACTION,
FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE RESTRICT ON UPDATE NO ACTION
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Die gespeicherte Prozedur, die ich verwende, ist folgende:
CREATE PROCEDURE updateProductUsers (IN rUsername VARCHAR(24),IN rProductID INT UNSIGNED,IN rPerm VARCHAR(16))
BEGIN
UPDATE productUsers
INNER JOIN users
ON productUsers.userID = users.userID
SET productUsers.permission = rPerm
WHERE users.username = rUsername
AND productUsers.productID = rProductID;
END
Ich habe mit PHP getestet, aber der gleiche Fehler wird mit SQLyog angezeigt. Ich habe auch getestet, die gesamte DB neu zu erstellen, aber nicht gut.
Jede Hilfe wird sehr geschätzt.
quelle
COLLATE utf8_unicode_ci
, Zeichenfolgenkonstanten hinzuzufügen :SET @EMAIL = '[email protected]' COLLATE utf8_unicode_ci;
. Dies ist besonders nützlich, wenn Sie ein Skript von einer Konsole aus ausführen, wobei die Standardcodierung der Konsole für die Sortierung Ihrer Zeichenfolgenkonstanten gilt.(utf8mb4_unicode_ci, IMPLICIT)
anstelle von(utf8_unicode_ci, IMPLICIT)
. Ich kratzte Daten aus dem Web mit Python und erstellte dann eine CSV-Datei mit den kratzenden Daten, die ich dann mit einer PHP-Datei auf meinem Server verarbeite, die die Daten in meine Datenbank hochlädt. Alle meine MySQL-Tabellen / Spalten werden als sortiertutf8mb4_unicode_ci
. Könnte das Problem auftreten, weil ich die Daten wieutf8
in Python / CSV codiere?Ich habe einen halben Tag damit verbracht, nach Antworten auf einen identischen Fehler "Illegale Mischung von Kollatierungen" mit Konflikten zwischen utf8_unicode_ci und utf8_general_ci zu suchen.
Ich habe festgestellt, dass einige Spalten in meiner Datenbank nicht speziell nach utf8_unicode_ci sortiert wurden . Es scheint, dass MySQL diese Spalten utf8_general_ci implizit zusammengestellt hat .
Insbesondere beim Ausführen einer Abfrage 'SHOW CREATE TABLE table1' wurde Folgendes ausgegeben:
Beachten Sie, dass in der Zeile 'col1' varchar (4) CHARACTER SET utf8 NOT NULL keine Sortierung angegeben ist. Ich habe dann die folgende Abfrage ausgeführt:
ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
Dies löste meinen Fehler "Illegale Mischung von Kollatierungen". Hoffe, das könnte jemand anderem da draußen helfen.
quelle
COLLATE
für die gesamte Tabelle (dhALTER TABLE table1 CHARSET utf8 COLLATE utf8_unicode_ci
) das Problem nicht behebt , sondern für jede (problematische) Spalte erfolgen muss.Ich hatte ein ähnliches Problem, aber es fiel mir innerhalb der Prozedur ein, als mein Abfrageparameter unter Verwendung der Variablen z
SET @value='foo'
.Was dies verursachte, war eine Nichtübereinstimmung
collation_connection
und eine Datenbanksortierung. Geändert, umcollation_connection
zu passencollation_database
und Problem ging weg. Ich denke, dies ist eleganter als das Hinzufügen von COLLATE nach param / value.Zusammenfassend: Alle Kollatierungen müssen übereinstimmen. Verwenden
SHOW VARIABLES
und sicherstellencollation_connection
undcollation_database
übereinstimmen (überprüfen Sie auch die Tabellensortierung mitSHOW TABLE STATUS [table_name]
).quelle
SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
Ein bisschen ähnlich wie bei @bpile answer war mein Fall eine my.cnf-Eintragseinstellung
collation-server = utf8_general_ci
. Nachdem ich das erkannt hatte (und nachdem ich alles oben versucht hatte), habe ich meine Datenbank zwangsweise auf utf8_general_ci anstatt auf utf8_unicode_ci umgestellt und das wars:quelle
In meinem Fall habe ich folgenden Fehler
Unzulässige Mischung von Kollatierungen (utf8_general_ci, IMPLICIT) und (utf8_unicode_ci, IMPLICIT) für die Operation '='
Nach wochenlanger Google-Suche habe ich festgestellt, dass die beiden Felder, die ich vergleiche, aus unterschiedlichen Sortierungsnamen bestehen. Der erste, dh der Benutzername, ist utf8_general_ci, während der zweite utf8_unicode_ci ist. Ich bin also zur Struktur der zweiten Tabelle zurückgekehrt und habe das zweite Feld (matric_no) in utf8_general_ci geändert, und es hat wie ein Zauber funktioniert.
quelle
Obwohl ich eine enorme Anzahl von Fragen zu demselben Problem gefunden habe ( 1 , 2 , 3 , 4 ), habe ich auch hier nie eine Antwort gefunden, die die Leistung berücksichtigt.
Obwohl bereits mehrere Arbeitslösungen angegeben wurden, möchte ich eine Leistungsüberlegung anstellen.
EDIT: Vielen Dank an Manatax für den Hinweis, dass Option 1 keine Leistungsprobleme aufweist.
Die Verwendung von Option
1 und2 , auch bekannt als COLLATE- Cast-Ansatz, kann zu einem möglichen Engpass führen, da kein in der Spalte definierter Index verwendet wird, was zu einem vollständigen Scan führt .Obwohl ich Option 3 nicht ausprobiert habe, ist meine Vermutung, dass es die gleichen Konsequenzen wie Option
1 und2 haben wird.Schließlich ist Option 4 die beste Option für sehr große Tabellen, wenn dies möglich ist. Ich meine, es gibt keine andere Verwendung, die auf der ursprünglichen Zusammenstellung beruht.
Betrachten Sie diese vereinfachte Abfrage:
In meinem ursprünglichen Beispiel hatte ich viel mehr Verknüpfungen. Natürlich haben Tabelle1 und Tabelle2 unterschiedliche Sortierungen. Wenn Sie den Sortieroperator zum Umwandeln verwenden, werden keine Indizes verwendet.
Siehe SQL-Erklärung im Bild unten.
Erläuterung der visuellen Abfrage bei Verwendung der COLLATE-Umwandlung
Andererseits kann Option 4 die Vorteile eines möglichen Index nutzen und zu schnellen Abfragen führen.
In der Abbildung unten sehen Sie dieselbe Abfrage, die nach Anwendung von Option 4 ausgeführt wird , auch bekannt als Ändern der Schema- / Tabellen- / Spaltenkollatierung.
Visuelle Abfrage Erläuterung, nachdem die Sortierung geändert wurde und daher ohne die Sortierbesetzung
Wenn die Leistung wichtig ist und Sie die Sortierung der Tabelle ändern können, wählen Sie abschließend Option 4 . Wenn Sie auf eine einzelne Spalte reagieren müssen, können Sie Folgendes verwenden:
quelle
Dies geschieht, wenn eine Spalte explizit auf eine andere Sortierung festgelegt ist oder die Standardkollatierung in der abgefragten Tabelle unterschiedlich ist.
Wenn Sie viele Tabellen haben, möchten Sie die Sortierung beim Ausführen dieser Abfrage ändern:
Dadurch werden die Abfragen ausgegeben, die zum Konvertieren aller Tabellen erforderlich sind, um die richtige Sortierung pro Spalte zu verwenden
quelle