MySql号码作为文本分区
问题描述:
我有表中存储为varchar的数字(我知道这是坏习惯,但数据不是来自我),并且我想用25.4将它们划分为整数(因此9,448应该是10 ),并存储为tinyint(2)无符号。如果varchar值是240,那么在划分之后,我得到9不正确的。如果我CAST
240到DECIMAL
(我必须使用十进制,因为有时他们就像240,5),那么它会在分割后给出正确的结果(但是我必须ROUND
它具有3,1,1,0小数点的4x),但MySql号码作为文本分区
UPDATE `table` SET dz = ROUND(ROUND(ROUND(ROUND(CAST(REPLACE(d, ',', '.') AS DECIMAL (6,1))/25.4, 3), 2), 1), 0);
,因为我得到了以下错误消息,是什么让我发疯:
不正确的十进制值:“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`;
这是怎么回事...?提前致谢!
答
必须是数据。我可以(我认为)重现你的错误如下(见最后插入值)
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)
我有不知道为什么update和select应该有区别。作为一种变通方法,你可以收紧你的更换是这样
replace(
REPLACE(trim(d), ',','.')
,' .','.')
一如以往GIGO您可能需要在尝试更新之前收拾d。