2012-04-04 48 views
1

这里有一个小问题。 我正在定期对MySQL表中的货币进行自动更新。生成的查询的 部分是:MySQL查询中的奇怪返回

UPDATE ara_curr SET 
curr_xchange=REPLACE(CONVERT(CONVERT('1.60739',DECIMAL(9,5))/CONVERT('10000',DECIMAL(9,5)),DECIMAL(9,5)),'.',','), 
curr_rev_xchange=REPLACE(CONVERT('6221.27',DECIMAL(9,5)),'.',',') 
WHERE curr_name='IDR'; 

我从在线服务获取值。然而这个查询返回

Out of range value for column (null) at row 1 

但是如果我打破它的转换返回这些

REPLACE(CONVERT('6221.27',DECIMAL(9,5)),'.',',') = 6221,27000 
CONVERT('1.60739',DECIMAL(9,5)) = 1,60739 
CONVERT('10000',DECIMAL(9,5)) = 9999,99999 
CONVERT(CONVERT('1.60739',DECIMAL(9,5))/CONVERT('10000',DECIMAL(9,5)),DECIMAL(9,5)) = 0,00016 

如果我尝试直接使用这些值如运行查询

UPDATE ara_curr SET curr_xchange='0,00016', curr_rev_xchange='6221,27000' WHERE curr_name='IDR'; 

它运行完美OK!

对此的任何想法?

回答

0

什么数据类型是curr_xchange和curr_rev_xchange?

如果我运行你的查询它返回结果作为二进制数据。 也许你可以在结果周围用CAST尝试这个修改。

UPDATE ara_curr SET 
curr_xchange=CAST(REPLACE(CONVERT(CONVERT('1.60739',DECIMAL(9,5))/CONVERT('10000',DECIMAL(9,5)),DECIMAL(9,5)),'.',',') AS CHAR), 
curr_rev_xchange=CAST(REPLACE(CONVERT('6221.27',DECIMAL(9,5)),'.',',') AS CHAR) 
WHERE curr_name='IDR'; 
+0

那么curr_xchange和curr_rev_xchange是VARCHAR。 但铸造不起作用。 我不确定他们为什么没有设置为DECIMAL,但没有什么大不了的。 – nnikolov06 2012-04-04 07:59:59

0

尝试使用CAST而不是CONVERT的:

UPDATE ara_curr 
SET  REPLACE(CAST(CAST('1.60739' AS DECIMAL(9, 5))/CAST('10000' AS DECIMAL(9, 5)) AS DECIMAL(9, 5)), '.', ',') AS curr_xchange 
     , REPLACE(CAST('6221.27' AS DECIMAL(9, 5)), '.', ',') AS curr_rev_xchange 
WHERE curr_name = 'IDR'; 

此外,你可能会遇到一些麻烦铸造10000DECIMAL(9, 5),因为它超出了允许的范围。您可能想将其转换为DECIMAL(10, 5)

+0

前段时间我已经将数据类型从varchar更改为decimal。所以转换成varchar问题已经消失。虽然没有关于10000个9,5个小数点的问题,但你绝对是对的。 它输出到9999,99999。谢天谢地,这是因为他们不会被使用而被删除的货币之一。我们坚持使用5-6(可能)没有如此高转换价值的货币。 感谢您的建议,但。会注意到它和(希望)我会记得下次我遇到这样的问题。 – nnikolov06 2012-10-28 18:05:40