sql >> Databasteknik >  >> RDS >> Mysql

Olaglig blandning av sammanställningar (utf8_unicode_ci,IMPLICIT) och (utf8_general_ci,IMPLICIT) för operation '='

Standardsorteringen för parametrar för lagrad procedur är utf8_general_ci och du kan inte blanda sammanställningar, så du har fyra alternativ:

Alternativ 1 :lägg till COLLATE till din indatavariabel:

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

Alternativ 2 :lägg till COLLATE till 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

Alternativ 3 :lägg till den i IN parameterdefinition (pre-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

Alternativ 4 :ändra själva fältet:

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;

Om du inte behöver sortera data i Unicode-ordning, skulle jag föreslå att du ändrar alla dina tabeller så att de använder utf8_general_ci sortering, eftersom det inte kräver några kodändringar och kommer att påskynda sorteringen något.

UPPDATERA :utf8mb4/utf8mb4_unicode_ci är nu den föredragna teckenuppsättningen/sorteringsmetoden. utf8_general_ci avråds från, eftersom prestandaförbättringen är försumbar. Se https://stackoverflow.com/a/766996/1432614



  1. Hur ändrar man teckenkodningen i en postgres-databas?

  2. Postgres ENUM-datatyp eller CHECK CONSTRAINT?

  3. mysql_fetch_row() vs mysql_fetch_assoc() vs mysql_fetch_array()

  4. Ladda CSV-data till MySQL i Python