2012-03-07 41 views
0

我試圖在MySQL中存儲經度和緯度信息。我使用Ruby來解析經緯度數據。它們被分別解析,然後組合成一個字符串變量。所以,如果我有:MySQL對字符串執行數學運算?

latitude = 43.78219.to_s 
longitude = -75.00326.to_s 
location = latitude + " " + longitude # => "43.78219 -75.00326" 

我有MySQL中的表來存儲這些數據,並將數據類型設置爲字符串VARCHAR。問題是,當我將位置字符串插入到表中時,MySQL執行數學運算並將字符串中的兩個數字相減。那我就像Whaaaaaaaaa ??????? 因此,它最終將存儲-31.22107作爲位置。難道我做錯了什麼?

這裏是我使用

db.query("insert into StationCapacityStatus 
     (city_id, station_id, location, empty_docks, nonempty_docks, timestamp) 
     values(
      23, 
      #{$station_number}, 
      #{location}, 
      #{$empty_docks}, 
      #{$nonempty_docks}, 
      #{$datetime} 
     )" 
) 
+0

添加您正在使用它保存到查詢數據庫。如果它不在引號中,那麼它有可能將它作爲一個等式來提取。 – judda 2012-03-07 03:41:01

+4

反正我會把它們存儲在不同的列中。 – pbond 2012-03-07 03:42:21

+0

@judda剛剛添加了我正在使用的查詢。 – 2012-03-07 03:48:31

回答

2

你不是引述location所以MySQL的看到裏面VALUES純43.78219 -75.00326,並把它解釋爲一個浮點表達式查詢。您應該使用quote方法正確轉義的字符串,以及:

db.query("insert into StationCapacityStatus 
    (city_id, station_id, location, empty_docks, nonempty_docks, timestamp) 
    values(
     23, 
     #{$station_number}, 
     '#{db.quote(location)}', 
     #{$empty_docks}, 
     #{$nonempty_docks}, 
     #{$datetime} 
    )" 
) 

你也應該切換到使用,如果可能的界限值準備的語句:

sth = db.prepare('insert into StationCapacityStatus (city_id, station_id, location, empty_docks, nonempty_docks, timestamp) values (?, ?, ?, ?, ?, ?)') 
sth.execute(23, $station_number, location, $empty_docks, $nonempty_docks, $datetime) 
+0

謝謝你,先生。 – 2012-03-07 04:14:17

+0

@icanc:不客氣,單獨的列(和'db.prepare')是一個很好的計劃。 – 2012-03-07 04:26:45