Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Unzulässige Mischung aus Sortierungen (utf8_unicode_ci,IMPLICIT) und (utf8_general_ci,IMPLICIT) für Operation „=“

Die Standardsortierung für gespeicherte Prozedurparameter ist utf8_general_ci und Sie können Sortierungen nicht mischen, also haben Sie vier Optionen:

Option 1 :Fügen Sie COLLATE hinzu zu Ihrer Eingabevariable:

SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);

Option 2 :Fügen Sie COLLATE hinzu zum WHERE Klausel:

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 -- COLLATE added
        AND productUsers.productID = rProductID;
END

Möglichkeit 3 :Fügen Sie es dem IN hinzu Parameterdefinition (vor MySQL 5.7):

CREATE PROCEDURE updateProductUsers(
    IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, -- COLLATE added
    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 :Ändern Sie das Feld selbst:

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;

Wenn Sie Daten nicht in Unicode-Reihenfolge sortieren müssen, würde ich vorschlagen, alle Ihre Tabellen so zu ändern, dass sie utf8_general_ci verwenden Sortierung, da keine Codeänderungen erforderlich sind und die Sortierung leicht beschleunigt wird.

AKTUALISIEREN :utf8mb4/utf8mb4_unicode_ci ist jetzt die bevorzugte Zeichensatz-/Kollatierungsmethode. Von utf8_general_ci wird abgeraten, da die Leistungssteigerung vernachlässigbar ist. Siehe https://stackoverflow.com/a/766996/1432614