我在表格中将数字存储为varchar(我知道这是不好的做法,但数据并非来自我),我想将它们除以25.4,舍入为整数(因此9,448应为10) ,并存储为tinyint(2)unsigned。如果varchar值为240,则在除法后得到9是不正确的。如果我CAST
240到DECIMAL
(我必须使用十进制,因为有时它们就像240,5)然后它会在分割后给出正确的结果(但是我必须ROUND
它4x with 3,2,1,0小数位),但我不能用这个命令更新表:
UPDATE `table` SET dz = ROUND(ROUND(ROUND(ROUND(CAST(REPLACE(d, ',', '.') AS DECIMAL (6,1))/25.4, 3), 2), 1), 0);
因为我收到以下错误消息,是什么让我发疯:
DECIMAL值不正确:' 0'对于专栏''在第-1行
因为在选择中它起作用:
SELECT DISTINCT d, ROUND(ROUND(ROUND(ROUND(CAST(REPLACE(d, ',', '.') AS DECIMAL (6,1))/25.4, 3), 2), 1), 0) AS dz FROM `table`;
这里发生了什么......?提前谢谢!
答案 0 :(得分:0)
必须是数据。我可以(我认为)重现您的错误,如下所示(参见最后一次插入值)
drop table if exists t;
create table t (d varchar(10), dz tinyint(2));
insert into t values
('240',null),
('240,5',null),
('9,448',null),
('240 ',null),
('240,',null),
(' ,1',null),
('1,0',null),
('0 ,1',null);
MariaDB [sandbox]> UPDATE t SET dz =
-> ROUND(
-> ROUND(
-> ROUND(
-> ROUND(
-> CAST(REPLACE(trim(d), ',', '.') AS DECIMAL (6,1))/25.4
-> , 3)
-> , 2)
-> , 1)
-> , 0);
ERROR 1292 (22007): Truncated incorrect DECIMAL value: '0 .1'
MariaDB [sandbox]>
正如你所说,选择没有问题
MariaDB [sandbox]> select *,
-> REPLACE(d, ',', '.')
-> ,CAST(REPLACE(trim(d), ',', '.') AS DECIMAL (6,1))/25.4
-> from t;
+-------+------+----------------------+--------------------------------------------------------+
| d | dz | REPLACE(d, ',', '.') | CAST(REPLACE(trim(d), ',', '.') AS DECIMAL (6,1))/25.4 |
+-------+------+----------------------+--------------------------------------------------------+
| 240 | NULL | 240 | 9.44882 |
| 240,5 | NULL | 240.5 | 9.46850 |
| 9,448 | NULL | 9.448 | 0.37008 |
| 240 | NULL | 240 | 9.44882 |
| 240, | NULL | 240. | 9.44882 |
| ,1 | NULL | .1 | 0.00394 |
| 1,0 | NULL | 1.0 | 0.03937 |
| 0 ,1 | NULL | 0 .1 | 0.00000 |
+-------+------+----------------------+--------------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)
我不知道为什么更新和选择之间应该存在差异。作为一种解决方法,你可以收紧更换这样的东西
replace(
REPLACE(trim(d), ',','.')
,' .','.')
与gigo一样,在尝试更新之前,您可能需要整理d。