我有一个假设有 INT 作为输入的函数。但是,当我传递任何字符串时,输入都会被接受。
为什么函数不会因为输入与输入类型不匹配而出错?
这是功能
DROP FUNCTION IF EXISTS erbaccess.canAdminIRB;
DELIMITER $$
CREATE FUNCTION erbaccess.canAdminIRB(_userID int) RETURNS int
BEGIN
set @canPerformAction = 0;
if (select count(*)
from erbaccess.usersVsGroupsVsActions
where (actionCode in ('ADMSYS', 'ADDIRB')
or privilegeGroupCode in ('SYS', 'REG')
and userID = _userID) > 0 then
set @canPerformAction = 1;
end if;
RETURN @canPerformAction;
END $$
当它应该为 0 时, RETURN
for@canPerformAction
也返回为 1。如果我使用假用户名(不是INT
,但是VARCHAR
)仅在此函数之外运行 if 语句,则返回为 0。
这就是 MySQL 自由执行隐式类型转换的方式。看到该函数需要一个整数参数,服务器会尝试将您提供的任何内容(字符串)转换为整数。如果字符串仅包含数字,则转换很简单。如果字符串先包含数字,然后包含一些非数字,则后者在第一个非数字处被截断,其余部分转换为整数。如果字符串以非数字开头,则将其转换为 0 。
小提琴手
从文档。
...
所以你应该在 SQL 严格模式下调用你的函数。请参阅有关如何通过动态设置全局变量或在配置文件中启动时在服务器级别启用严格模式或在服务器级别启用严格模式的文档。
考虑一个例子(MySQL 5.7)