MySQL存储过程MATCH AGAINST报错#1210求助
解决MySQL存储过程中MATCH AGAINST的#1210错误
我一眼就看出问题所在了——你的存储过程参数名和表中的列名完全重名了!这会让MySQL在解析SQL语句时混淆你到底指的是参数还是表列,直接导致MATCH AGAINST接收到错误的参数,触发#1210错误。
问题根源
你定义的参数Importer和Description,恰好和cars表中的importer、description列同名(MySQL默认不区分大小写,但在标识符解析时会因为重名产生歧义)。当你在WHERE子句里写importer = Importer或者MATCH (description) AGAINST(Description)时,MySQL根本分不清哪个是参数、哪个是表列,自然会抛出参数不正确的错误。而单独执行SQL时没有这个问题,是因为你直接传入了具体值,不存在标识符混淆的情况。
修复方案
最稳妥的解决办法是修改参数名,避免和列名冲突,比如给参数加上前缀(比如p_),让MySQL能清晰区分参数和列:
DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `searchItem`(IN `p_Importer` VARCHAR(100), IN `p_Description` TEXT) BEGIN SELECT model, date_of_production, horsepower, importer, description FROM cars WHERE importer = p_Importer AND MATCH (description) AGAINST(p_Description) ORDER BY date_of_production ASC; END$$ DELIMITER ;
如果你不想修改参数名,也可以通过表名限定列名来明确指定:
DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `searchItem`(IN `Importer` VARCHAR(100), IN `Description` TEXT) BEGIN SELECT model, date_of_production, horsepower, importer, description FROM cars WHERE cars.importer = Importer AND MATCH (cars.description) AGAINST(Description) ORDER BY date_of_production ASC; END$$ DELIMITER ;
不过第一种方案更直观,能从根源上避免这类标识符冲突问题,推荐使用。
验证
修改后重新创建存储过程,再调用它应该就能正常执行查询了,不会再触发#1210错误。
内容的提问来源于stack exchange,提问作者Angel Deykov
相关产品推荐
相关产品推荐

