De standaardsortering voor parameters van opgeslagen procedures is utf8_general_ci
en je kunt geen sorteringen combineren, dus je hebt vier opties:
Optie 1 :voeg COLLATE
toe naar uw invoervariabele:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Optie 2 :voeg COLLATE
toe naar de WHERE
clausule:
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
Optie 3 :voeg het toe aan de IN
parameterdefinitie (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
Optie 4 :verander het veld zelf:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
Tenzij u gegevens in Unicode-volgorde moet sorteren, raad ik u aan al uw tabellen te wijzigen om utf8_general_ci
te gebruiken sortering, omdat er geen codewijzigingen nodig zijn, en het sorteren iets zal versnellen.
UPDATE :utf8mb4/utf8mb4_unicode_ci is nu de geprefereerde tekenset/sorteermethode. utf8_general_ci wordt afgeraden, omdat de prestatieverbetering verwaarloosbaar is. Zie https://stackoverflow.com/a/766996/1432614