我不明白以下的作品
SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders;
但更新失败了:
UPDATE orders SET price = CAST(price AS DECIMAL(10,2));
UPDATE orders SET price = CAST(CAST(price AS DECIMAL(10,2)) AS CHAR(20));
有错误:
Error Code: 1366. Incorrect DECIMAL value '0' for column '' at row -1
列price
是TEXT
在我的理解中,SELECT
应该与UPDATE
完全相同
在选择中,您只需在更新中显示强制转换的结果,您可以在非数字中保存小数 尝试将结果转换为字符串
UPDATE orders SET price = CAST(CAST(ifnull(price,0) AS DECIMAL(10,2) AS char(20));
或者你可能有一个不能作为十进制转换的值,例如,你可以使用案例检查不同的条件
UPDATE orders SET price = CAST(CAST(
CASE when price IS NULL THEN 0
when trim(price) ='' THEN 0
ELSE price
END ) AS DECIMAL(10,2) AS char(20));
如你所述:
列
price
是TEXT
。
因此,在第一个示例中,您将文本值转换为十进制值。
您的第二个查询(更新)是有问题的,因为您尝试将文本属性更新为自身的十进制版本。更新文本值时,无需将其强制转换为小数。
你的陈述,
根据我的理解,SELECT应该与UPDATE完全相同
存在缺陷:使用SELECT
,您可以从数据中提取数据以供其他流程使用。这可能涉及将属性转换为另一种数据类型。
使用UPDATE
语句,新值应与属性的数据类型相同。由于price
是文本,因此新值应该是文本(这就是为什么你不应该将属性更新为自身的DECIMAL版本)。
你可能在某个地方有一个空值
CREATE TABLE `orders` (
`price` VARCHAR(100) NOT NULL);
INSERT INTO orders (price) VALUES (''); -- Empty value
没有错误:
SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders;
错误:
UPDATE orders SET price = CAST(price AS DECIMAL(10,2));
没错误:
UPDATE orders SET price = CAST(price AS DECIMAL(10,2)) WHERE price <> ''