sql >> Database teknologi >  >> RDS >> Mysql

Ulovlig blanding af sammenstillinger (utf8_unicode_ci,IMPLICIT) og (utf8_general_ci,IMPLICIT) for operation '='

Standardsorteringen for lagrede procedureparametre er utf8_general_ci og du kan ikke blande sammenstillinger, så du har fire muligheder:

Mulighed 1 :tilføje COLLATE til din inputvariabel:

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

Mulighed 2 :tilføje COLLATE til WHERE klausul:

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

Mulighed 3 :tilføj det til IN parameterdefinition (præ-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

Mulighed 4 :ændre selve feltet:

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;

Medmindre du skal sortere data i Unicode-rækkefølge, vil jeg foreslå, at du ændrer alle dine tabeller til at bruge utf8_general_ci sortering, da det ikke kræver kodeændringer og vil fremskynde sorteringen en smule.

OPDATERING :utf8mb4/utf8mb4_unicode_ci er nu den foretrukne tegnsæt/sorteringsmetode. utf8_general_ci frarådes, da præstationsforbedringen er ubetydelig. Se https://stackoverflow.com/a/766996/1432614



  1. Er det muligt at GRUPPE BY flere kolonner ved hjælp af MySQL?

  2. Oracle Slet rækker, der matcher flere værdier

  3. SCOPE_IDENTITY() for GUID'er?

  4. Bindestreger i kolonnenavne i MySQL DB