Heim  >  Artikel  >  Datenbank  >  Wie kann der Fehler „Illegale Mischung von Sortierungen“ in MySQL behoben werden?

Wie kann der Fehler „Illegale Mischung von Sortierungen“ in MySQL behoben werden?

DDD
DDDOriginal
2024-11-16 10:34:02536Durchsuche

How to Solve the

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn