gpt4 book ai didi

mysql - 强制转换为有符号,然后分配给 int

转载 作者:行者123 更新时间:2023-11-29 17:34:21 25 4
gpt4 key购买 nike

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

最佳答案

MySQL 警告代码 1292 通常是警告,而不是错误。

注意:以下内容是我的猜测。只是我的想法,不代表任何 MySQL 官方文档

我认为区别在于表达式的结果被分配给一个变量。

这个

SELECT CAST('0' AS SIGNED)

工作时不会出现警告,因为转换已成功。我们可以将返回值分配给变量,或者将其作为结果集返回。

但是这个值“不正确”:

SELECT CAST('' AS SIGNED)

当我们只是返回结果集时有效(不显示警告)。即使转换不成功(空字符串不是“正确的”整数值),我们只是返回一个结果集,所以这并不重要,而且我们不需要发出虚假警告。

我们通过 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应该显示一个警告。

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

<小时/>

当然,还有几种解决方法;修改表达式的方法,使其不会引发警告。

关于mysql - 强制转换为有符号,然后分配给 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com