2012-03-07 90 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