Behebung des Fehlers „Illegal Mix of Collations“ in MySQL
Bei der Durchführung von Datenbankvorgängen, bei denen Textdaten verglichen oder bearbeitet werden, ist es von entscheidender Bedeutung, die Konsistenz sicherzustellen in Zeichenkollationen. In MySQL weist die Fehlermeldung „Illegal mix of collations“ typischerweise auf eine Inkompatibilität zwischen den für die Operanden in einer Operation verwendeten Sortierungen hin.
Im bereitgestellten Code entsteht das Problem durch einen Konflikt zwischen den in der verwendeten Sortierungen Folgende Tabellen und gespeicherte Prozeduren:
CREATE TABLE users ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; CREATE TABLE products ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; CREATE TABLE productUsers ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; 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
Die Eingabeparameter der gespeicherten Prozedur und die Benutzernamenspalte der Benutzertabelle werden mit der Standardsortierung deklariert utf8_general_ci, während die Berechtigungsspalte der Tabelle „productUsers“ und der Parameter „rPerm“ mit der Sortierung „utf8_unicode_ci“ deklariert werden.
Um dieses Problem zu beheben, haben Sie mehrere Optionen:
Option 1: COLLATE hinzufügen zu Eingabevariablen
Hängen Sie die COLLATE-Klausel an die Eingabe an Variablen im Aufruf der gespeicherten Prozedur, um die Sortierung utf8_unicode_ci explizit anzugeben.
$rUsername = 'aname' COLLATE utf8_unicode_ci; $call = "CALL updateProductUsers(@rUsername, @rProductID, @rPerm);";
Option 2: COLLATE zur WHERE-Klausel hinzufügen
Fügen Sie die COLLATE-Klausel zur WHERE-Klausel hinzu in der Definition der gespeicherten Prozedur, um die Sortierung „utf8_unicode_ci“ für „users.username“ anzugeben Spalte.
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 COLLATE utf8_unicode_ci AND productUsers.productID = rProductID; END
Option 3: COLLATE zur IN-Parameterdefinition hinzufügen
Für MySQL-Versionen vor 5.7 können Sie die COLLATE-Klausel zur IN-Parameterdefinition hinzufügen in der gespeicherten Prozedur selbst.
CREATE PROCEDURE updateProductUsers( IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, 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
Option 4: Tabelle ändern Feld
Ändern Sie die Benutzernamenspalte in der Benutzertabelle, um die Sortierung utf8_unicode_ci zu verwenden.
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Während utf8_general_ci im Allgemeinen schneller für die Datensortierung ist, wird die Verwendung von utf8mb4/utf8mb4_unicode_ci empfohlen da es eine größere Auswahl an Unicode-Zeichen unterstützt.
Das obige ist der detaillierte Inhalt vonWie kann der Fehler „Illegale Mischung von Sortierungen' in MySQL behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!