Susunan default untuk parameter prosedur tersimpan adalah utf8_general_ci
dan Anda tidak dapat mencampur susunan, jadi Anda memiliki empat opsi:
Opsi 1 :tambahkan COLLATE
ke variabel input Anda:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Opsi 2 :tambahkan COLLATE
ke WHERE
klausa:
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
Opsi 3 :tambahkan ke IN
definisi parameter (pra-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
Opsi 4 :mengubah bidang itu sendiri:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
Kecuali Anda perlu mengurutkan data dalam urutan Unicode, saya sarankan mengubah semua tabel Anda untuk menggunakan utf8_general_ci
collation, karena tidak memerlukan perubahan kode, dan akan sedikit lebih cepat.
PERBARUI :utf8mb4/utf8mb4_unicode_ci sekarang menjadi metode kumpulan/pengumpulan karakter yang disukai. utf8_general_ci tidak disarankan, karena peningkatan kinerja dapat diabaikan. Lihat https://stackoverflow.com/a/766996/1432614