我不理解以下作品
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
完全一样
答案 0 :(得分:1)
在选择中,您仅在更新中将转换结果显示为小数,将小数保存为非数字
尝试将resul转换为字符串
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));
答案 1 :(得分:0)
如您陈述:
列
price
是TEXT
。
因此,在第一个示例中,您正在将文本值转换为十进制值。
您的第二个查询(更新)有问题,因为您试图将文本属性更新为自身的十进制版本。更新文本值时,无需将其转换为小数。
您的声明,
据我所知,SELECT应该和UPDATE完全一样
有缺陷:使用SELECT
,您将从数据中提取数据以供其他过程使用。这可能涉及将属性强制转换为另一种数据类型。
使用UPDATE
语句,新值应与属性的数据类型相同。由于price
是文本,因此新值应该是文本(这就是为什么您不应该将属性更新为本身的DECIMAL版本的原因。)
答案 2 :(得分:0)
您某处的值可能为空
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 <> ''