MySQL存储过程误将含0x的Varchar参数识别为十六进制的问题及解决方法
存储过程调用含
0x1的字符串参数失败的原因与解决办法 问题场景
定义存储过程如下:
CREATE PROCEDURE AssignValuePosition ( IN accountId INT, IN valueType VARCHAR(128), IN value VARCHAR(2000) )
执行以下调用语句时失败:
call AssignValuePosition( 15, 'URL', 'hyh00x1' );
但将最后一个参数改为'hyh00x'后,执行以下语句可正常运行:
call AssignValuePosition( 15, 'URL', 'hyh00x' );
排查确认问题出在参数的0x1部分。
原因分析
部分SQL客户端(如MySQL命令行客户端)默认会将以0x开头的内容解析为十六进制字面量。当字符串中出现0x1时,客户端的语法解析逻辑会误判,把'hyh00x1'错误识别为'hyh0'拼接十六进制值0x1,导致参数值被篡改,最终引发语法错误或存储过程执行异常。
解决方法
方法1:转义0x中的字符
在字符串里将0x写成0\x,避免客户端将其识别为十六进制前缀,修改后的调用语句:
call AssignValuePosition( 15, 'URL', 'hyh00\x1' );
方法2:使用预处理语句传递参数
通过预处理语句的方式传递参数,绕开客户端对字符串的直接解析,示例代码:
SET @accountId = 15; SET @valueType = 'URL'; SET @value = 'hyh00x1'; PREPARE stmt FROM 'CALL AssignValuePosition(?, ?, ?)'; EXECUTE stmt USING @accountId, @valueType, @value; DEALLOCATE PREPARE stmt;
方法3:调整客户端解析配置
如果使用MySQL客户端,可以关闭hex-blob解析规则:
- 临时关闭:执行
SET sql_mode = '';(不同版本可能需调整,核心是禁用十六进制自动解析) - 永久生效:启动客户端时添加
--skip-hex-blob参数,或修改客户端配置文件关闭该选项。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

