存储过程参数的默认排序规则为
utf8_general_ci并且您不能混合排序规则,因此有四个选项:
选项1 :添加
COLLATE到您的输入变量中:
SET @rUsername = ‘aname’ COLLATE utf8_unipre_ci; -- COLLATE addedCALL updateProductUsers(@rUsername, @rProductID, @rPerm);
选项2 :
COLLATE在
WHERe条款中添加:
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_unipre_ci -- COLLATE added AND productUsers.productID = rProductID;END
选项3 :将其添加到
IN参数定义中:
CREATE PROCEDURE updateProductUsers( IN rUsername VARCHAr(24) COLLATE utf8_unipre_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
选项4 :更改字段本身:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
除非您需要按Unipre顺序对数据进行排序,否则我建议您更改所有表以使用utf8_general_ci
排序规则,因为它不需要更改代码,并且会稍微加快排序速度。
更新 :utf8mb4 /
utf8mb4_unipre_ci现在是首选的字符集/排序规则方法。建议不要使用utf8_general_ci,因为性能提升可忽略不计。参见https://stackoverflow.com/a/766996/1432614



