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