MySql编号为文本分区

时间:2017-06-27 07:59:04

标签: mysql

我在表格中将数字存储为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`;

这里发生了什么......?提前谢谢!

1 个答案:

答案 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。