MariaDB存储过程出现排序规则不兼容错误(1267)求助
MariaDB存储过程排序规则冲突问题解决
错误原因
你确认recordid列排序规则为utf8mb4_general_ci,但存储过程的输入参数mytable_id默认继承了会话或数据库的默认排序规则(此处为utf8mb4_unicode_ci),当执行等值比较时,两种不同的排序规则无法兼容,触发1267错误。
解决办法
方法1:参数定义时指定匹配的排序规则
修改存储过程,在参数声明阶段明确设置与recordid列一致的排序规则:
CREATE DEFINER=`User`@`%` PROCEDURE `MYTABLE`(IN mytable_id VARCHAR(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci) BEGIN SELECT * FROM mytables WHERE recordid = mytable_id; END
方法2:查询中转换参数排序规则
若不想修改参数定义,可在WHERE子句中转换参数的排序规则,使其与列匹配:
CREATE DEFINER=`User`@`%` PROCEDURE `MYTABLE`(IN mytable_id VARCHAR(36)) BEGIN SELECT * FROM mytables WHERE recordid = CONVERT(mytable_id USING utf8mb4) COLLATE utf8mb4_general_ci; END
额外建议
- 执行
SHOW VARIABLES LIKE 'collation%';查看当前数据库和会话的默认排序规则,确认参数继承的规则来源。 - 长期来看,建议统一数据库、表、列的排序规则,避免此类兼容性问题反复出现。
内容的提问来源于stack exchange,提问作者Elcid_91
相关产品推荐
相关产品推荐

