强制转换为signed,然后赋值给int

时间:2018-05-18 19:21:18

标签: mysql

有关于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值:''

1 个答案:

答案 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应该显示警告。

我认为这里的部分原因是我们可能会依赖分配给变量的值。 (如果我们不这样做,我们就不会分配给变量。)并且最好显示它出现的潜在问题,而不是让它在两个或十二个步骤之后出现,并且必须回溯以找出塑料正在发生。

当然,有几种解决方法;修改表达式的方法,以便它不会发出警告。