2012-04-04 16 views
1

Ich habe ein kleines Problem hier. Ich mache regelmäßig eine automatische Aktualisierung von Währungen in einer MySQL-Tabelle. Ein Teil der erzeugten Abfrage ist:Seltsame Rückkehr in MySQL Abfragen

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'; 

ich die Werte aus einem Online-Dienst zu bekommen. Doch diese Abfrage gibt

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

Allerdings, wenn ich es brechen die Umsätze kehren diese

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 

Und wenn ich versuchen, die Abfrage direkt mit diesen Werten laufen z.B.

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

Es läuft perfekt in Ordnung!

Irgendwelche Ideen dazu?

Antwort

0

Welche Datentypen sind curr_xchange und curr_rev_xchange?

Wenn ich Ihre Abfrage ausführen, gibt das Ergebnis als Binärdaten zurück. Vielleicht können Sie diese Modifikation mit einem CAST um die Ergebnisse versuchen.

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

Nun sind die curr_xchange und curr_rev_xchange VARCHAR. Aber Casting funktioniert auch nicht. Ich bin mir nicht ganz sicher, warum sie nicht als DECIMAL festgelegt wurden, aber keine große Sache. – nnikolov06

0

Versuchen CAST statt CONVERT mit:

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'; 

Auch Sie können in einige Schwierigkeiten führen 10000 als DECIMAL(9, 5) Gießen, wie es den zulässigen Bereich überschreitet. Vielleicht möchten Sie das stattdessen in DECIMAL(10, 5) umwandeln.

+0

Ich habe die Datentypen vor einiger Zeit von Varchar in Dezimal geändert. Also sind die Varchar-Probleme verschwunden. Haben Sie nicht Probleme mit 9,5 Dezimalstellen auf 10000, aber Sie haben absolut Recht. Es wird auf 9999,99999 ausgegeben. Zum Glück war dies eine der Währungen, die entfernt wurden, weil sie nicht verwendet wurden. Wir blieben bei 5-6 (wahrscheinlich) Währungen, die keine so hohen Umwandlungswerte haben. Danke für den Rat aber. Ich werde es merken und (hoffentlich) werde ich mich an das nächste Mal erinnern, wenn ich über solch ein Problem komme. – nnikolov06