Đối chiếu mặc định cho các tham số thủ tục được lưu trữ là utf8_general_ci
và bạn không thể kết hợp các ảnh ghép, vì vậy bạn có bốn tùy chọn:
Tùy chọn 1 :thêm COLLATE
vào biến đầu vào của bạn:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Tùy chọn 2 :thêm COLLATE
đến WHERE
mệnh đề:
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
Tùy chọn 3 :thêm nó vào IN
định nghĩa tham số (trước 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
Tùy chọn 4 :thay đổi chính trường:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
Trừ khi bạn cần sắp xếp dữ liệu theo thứ tự Unicode, tôi khuyên bạn nên thay đổi tất cả các bảng của mình để sử dụng utf8_general_ci
đối chiếu, vì nó không yêu cầu thay đổi mã và sẽ tăng tốc độ sắp xếp một chút.
CẬP NHẬT :utf8mb4 / utf8mb4_unicode_ci hiện là phương thức đối chiếu / đặt ký tự được ưu tiên. utf8_general_ci được khuyên không nên vì việc cải thiện hiệu suất là không đáng kể. Xem https://stackoverflow.com/a/766996/1432614