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。