有关于mysql转换和分配的问题,现在我已经确定了问题' (如果是一个)我可以解决,而不是寻找。但是经过一段时间努力解决这个问题后,我真的只想知道原因。这对我来说没有意义,并且想要理解这个推理。
declare wu smallint;
-- why does this work
select cast('0' as signed) into wu;
-- but this does not
select cast('' as signed) into wu;
-- even though below actually returns 0
select cast('' as signed);
SQL错误[1292] [22001]:数据截断:截断错误的INTEGER值:''
答案 0 :(得分:0)
MySQL警告代码1292通常是警告,而不是错误。
注意:以下是我的猜想。只是我的想法,不代表任何官方的MySQL文档
我认为区别在于表达式的结果是分配到变量。
这个
SELECT CAST('0' AS SIGNED)
在没有警告的情况下工作,因为转换成功。我们可以将返回值赋给变量,或者将其作为结果集返回。
但是这有一个“不正确”的值:
SELECT CAST('' AS SIGNED)
当我们刚刚返回结果集时,工作(不显示警告)。即使转换不成功(空字符串不是“正确的”整数值),我们只是返回结果集,所以它确实无关紧要,我们不需要发出虚假警告。 / p>
我们用INTO local_variable
观察到的差异,例如
SELECT CAST('' AS SIGNED) INTO foo
表示返回已分配到变量,这就是导致警告显示的原因。
要说一种不同的方式......运行它作为一个裸SELECT,那就是MySQL服务器只返回一个结果集。
如果我们尝试将作为值分配给用户定义的变量,我们可以让MySQL显示警告。我们可以在存储例程的上下文之外执行此操作:
CAST('' AS SIGNED) INTO @foo
Warning Code: 1292
Truncated incorrect INTEGER value: ''
我认为理由是,如果评估只是进入结果集,则无需显示警告。
但如果将评估结果分配给变量,MySQL应该显示警告。
我认为这里的部分原因是我们可能会依赖分配给变量的值。 (如果我们不这样做,我们就不会分配给变量。)并且最好显示它出现的潜在问题,而不是让它在两个或十二个步骤之后出现,并且必须回溯以找出塑料正在发生。
当然,有几种解决方法;修改表达式的方法,以便它不会发出警告。