更新具有不同列长度的表并将文本与整数进行比较时,MYSQL 行为不一致

Inconsistent MYSQL behaviour when updating table with different column lengths and comparing text to integer

提问人:Lehren 提问时间:5/8/2023 更新时间:5/8/2023 访问量:22

问:

如果我有一张桌子,比如

create table test
(
    id    varchar(255) not null
        primary key,
    price varchar(10)  not null,
    link  varchar(255) not null
);

它有这样的数据:

编号 价格 链接
1 50 发短信
2 50 发短信
3 50美元 发短信

我运行一个查询,比如update test set link = 'a' where price <= 50;

MySQL给我一个错误[22001][1292] Data truncation: Truncated incorrect DOUBLE value: '50 USD'

但是,如果我突然更改了列长度,则查询不会引发错误,并且(某种程度上)可以更新所有列,包括其中的列。这很奇怪。pricevarchar(255)price50 USD

为什么?这是一个设置吗?这是mysql中的故障吗?列长度的截止值,当它出错时,当它不出错时,它似乎是完全任意的,并且在不同的数据库中是不同的

MySQL 截断

评论

0赞 Stu 5/8/2023
不会生成错误的实际长度为 64;我不是 Mysql 专家,但猜测这与隐式转换有关。无论如何,您正在将整数与字符串进行比较 - 不要那样做,将苹果与苹果进行比较,所以它应该是 - 当然,这不会像您期望的那样工作,因为您不应该将价格存储为 varchar。<= '50'
0赞 Lehren 5/8/2023
是的,我们允许用户创建任意表并在其中加载自己的数据,因此我们必须将所有内容视为文本,因为我们无法确定应该包含整数的列是否只包含整数。
0赞 Lehren 5/8/2023
64 的列长度仍然为我生成错误。就我而言,截止值似乎是 85
0赞 Stu 5/8/2023
你可以在这个数据库小提琴上看到它,也许它是依赖于版本的模棱两可的行为;无论如何,即使它没有引起错误,您也不能将字符串作为数字进行比较,并期望它像数字一样进行比较。

答:

0赞 SelVazi 5/8/2023 #1

这是一种仅使用REGEXP_SUBSTR

update test set link = 'a' where REGEXP_SUBSTR(price,"[0-9]+") <= 50;

在这里演示

评论

0赞 Lehren 5/8/2023
不过,我不想提取数字。它应该适用于仅包含数字的列。这还包括“50.00”和“50,00”等双打。
0赞 SelVazi 5/8/2023
使用作品..您使用的是哪个mysql版本?REGEXP_SUBSTR
0赞 Lehren 5/8/2023
啊,你编辑了你的评论,我只尝试了未签名的选角。但是请参阅我更新的评论,我的问题不是专门关于如何解决这个问题,而是为什么 mysql 根据列长度给出不一致的结果。
0赞 SelVazi 5/8/2023
我补充了两个建议:)当我测试时,我发现只有带有REGEXP_SUBSTR的解决方案有效