更改 MYSQL UPDATE 的数据类型,以解决错误 1292 WHERE 上的截断错误双值在 VARCHAR(45) 上失败

问题描述 投票:0回答:1

我已经查看了所有错误 1292 截断错误双值问题,但无法从中得出解决方案。

然而,答案让我做出了一个我无法证明的假设:

我正在使用 MYSQL2 库从 NODEJS 查询 MYSQL。我的名为shoptableplayground 的表包含一个名为regular_price 的列/字段。它具有数据类型属性 VARCHAR(45)。

我想将所有行的所述列/字段的值增加 10%。

我从以下查询中收到错误 1292:

UPDATE shoptableplayground 
SET regular_price = regular_price * 1.1 WHERE regular_price BETWEEN 1 AND 200; 

我假设我收到错误,因为 WHERE 期望比较数字数据类型(DEC、INT 等)以便能够进行实际比较。

我结合 CONVERT 或 CAST 甚至 ALTER TABLE MODIFY COLUMN 数据类型的各种尝试都会导致 MYSQL 语法错误。不幸的是,大多数教程都涵盖 SELECT 或某种形式的直接数据操作。

我还尝试使用 DECIMAL(10.2) 列作为常规_价格列重建表,但填充过程(在我的控制范围之外)似乎仍然将数据插入为字符串/VARCHAR。

任何有关如何解决问题的查询建议将不胜感激。

mysql
1个回答
0
投票

首先,将计算出的数字存储为 VARCHAR 类型是一个很大的错误,但我们暂时忽略它。

重点,您有一列包含许多由价格(浮动)填充的行,但它被视为 VARCHAR 列,我们无法对其进行计算。

诀窍是施法两次:

  • 第一次:从 VARCHAR 转换为 FLOAT 来进行所需的计算
  • 第二次:将计算结果转换为FLOAT 输入列类型(VARCHAR)

您还可以设置条件来确保价格的区间(0到200之间)

UPDATE shoptableplayground
SET regular_price = CAST(CAST(regular_price AS DECIMAL(10,2)) * 1.1 AS CHAR)
WHERE CAST(regular_price AS DECIMAL(10,2)) BETWEEN 1 AND 200;
© www.soinside.com 2019 - 2024. All rights reserved.