gpt4 book ai didi

mysql - 在 MySQL 中的整数字段上运行带引号(字符串)的查询时会发生什么并发症

转载 作者:可可西里 更新时间:2023-11-01 07:02:30 25 4
gpt4 key购买 nike

在 SQL 中,您不应该引用整数,因为如果您引用,它将是一个字符串。

但我很好奇如果这样做会出现什么问题/并发症?

例如:
SELECT * FROM table WHERE id = 1(正确)
对比
SELECT * FROM table WHERE id = '1'(不正确)

附言在这个问题上没有找到任何重复项。有的话请指正

最佳答案

这是一个有趣的问题,我花了很多时间研究可能的结果(对于 mysql)。

到目前为止,我只能找到 1,5 个缺点:

  • 首先,如果在查询中将其中一个操作数作为字符串发送给 BIGINT 值执行数学运算或比较运算,您会得到奇怪的结果 - 因为在这种情况下 both operands will be cast to floats从而失去精度。这是一个演示代码。只需运行这些查询并检查结果,这非常令人尴尬:

    create table bint(i bigint);
    insert into bint values (18014398509481984);
    update bint set i=i+'1';
    update bint set i=i+1
    update bint set i=i+'1'

    但对于仅选择或更新 BIGINT 值,将它们在查询中引用或在准备好的语句中绑定(bind)为字符串仍然没有问题。

  • 其次,我只算了一半的问题,因为我仍然找不到很好的证明。但 DBA 坚持认为有一些神秘的查询非常复杂,优化器可能会被错误的数据类型破坏并选择错误的执行计划。然而,在我 15 年以上的经验中,我并没有找到一个。我会将最大赏金用于能够提供可重现证据的答案,而不仅仅是过去美好时光的故事。

因此您可以看出,对于具有常规数据类型的常规查询,绝对没有区别。

唯一在语法上不允许字符串操作数的查询部分是 LIMIT 子句:LIMIT '1' 将导致语法错误。

但是,对于准备好的语句,如果您将 LIMIT 参数绑定(bind)为字符串,它就可以正常工作:

$stmt = $mysqli->prepare("SELECT value FROM table LIMIT ?");
$stmt->bind_param("s", $limit);

将没有错误。

关于mysql - 在 MySQL 中的整数字段上运行带引号(字符串)的查询时会发生什么并发症,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36762142/

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