尝试将varchar转换为十进制时的奇怪行为

时间:2017-03-27 23:41:34

标签: mysql string casting decimal

我的表格有mrr varchar(64)列。我无法更改列的类型。

这个简单的查询:

select mrr, cast(mrr as decimal(10,2)) ass f_mrr
FROM projects
where mrr is not null and creator_fname='Lisa'

返回意外结果。以下是部分列表:

mrr         cast(mrr as decimal(10,2))
663.90      663.90
40.00       40.00
675.00      675.00
0.00        0.00
100.00      100.00
2,950.00    2.00
3,779.90    3.00
-8,482.00   -8.00   

最后3行有什么用?我假设这是CAST这样做的。

有人可以解释发生了什么吗? 为什么它只对某些行而不是其他行执行此操作?

如何可靠地将varchar(64)投射到decimal

2 个答案:

答案 0 :(得分:4)

正在发生的是逗号是不是有效号码的一部分。 MySQL停止解析第一个非“数字”字符的数字。

当MySQL将字符串转换为数字时,它仅转换前导“数字”字符,其中包括可选的前导符号,数字,可选的小数点和更多数字。

其他所有内容都被截断/忽略。顺便说一句,这包括整个字符串,如果它不开始带有“数字”。

您可以尝试以下查询:

select mrr, cast(trim(replace(mrr, ',', '')) as decimal(10,2)) as f_mrr
from projects
where mrr is not null and creator_fname = 'Lisa'

答案 1 :(得分:0)

试试这个:

set @a = "295.00";
select if(right(@a,2)=00,CONCAT_WS('.',convert(@a,decimal(10,2))),@a)