MySQL存储过程需为输入变量加引号才能运行?求解实现方法
解决存储过程中IP参数匹配失败的问题
你完全不需要给存储过程里的变量_ownerip加单引号!加了反而会让SQL去查找ip字段等于字符串'_ownerip'的记录,这当然不会返回你想要的结果——这是新手写存储过程时很容易踩的坑。
那为什么你的存储过程执行失败?大概率是这几个原因:
字符集不匹配:你的参数
_ownerip指定了utf32字符集,但如果data表的ip字段用的是更常见的utf8mb4或utf8字符集,字符集不一致会导致字符串对比失效。解决方法是把参数的字符集改成和字段一致,比如:CREATE DEFINER=`root`@`localhost` PROCEDURE `GetData`(IN `_ownerip` VARCHAR(32) CHARSET utf8mb4) NO SQL SELECT * FROM data WHERE ip = _ownerip LIMIT 10;或者在对比时显式转换字符集:
WHERE ip = CONVERT(_ownerip USING utf8mb4)调用存储过程时传参错误:调用时必须把IP字符串用单引号包裹,比如:
CALL GetData('10.0.0.1');如果直接写
CALL GetData(10.0.0.1);,数据库会把它当成数字表达式处理,转换后的字符串不是你预期的IP值,自然匹配不到。字段类型不匹配:确认
data表的ip字段是VARCHAR或CHAR类型,如果是INT或其他非字符串类型,字符串参数和它对比肯定会失败,需要调整字段类型或者转换参数类型。
再强调一遍:存储过程中的变量是直接引用的,不需要额外加引号——引号是用来包裹字面量字符串的,变量本身已经是字符串类型的参数了,直接和字段对比就可以。
内容的提问来源于stack exchange,提问作者Graham Smart
相关产品推荐
相关产品推荐

