SQL未保存正确的浮点值

时间:2019-06-03 21:05:07

标签: mysql sql

我正在保存某些对象的厚度,长度和宽度以及坐标,所有这些值都是浮点数。

当我尝试将它们保存到sql数据库时,将39.888之类的值另存为1.0000000

我已将sql列从double更改为float,但它没有任何更改。

这是我要上传到数据库中的代码

INSERT INTO items (
  Cod, Date, TownHall, Parish, Place, 
  Epoch, RawMaterial, Description, Base, Technology, 
  Length, Width, Thickness, Latitude, Longitude, 
  Bibliography, Image) 
VALUES (
  1, '2019-05-17', 'Idanha-a-Nova', 'Ladoeiro', 'Oliveiras',
  'Idade do Bronze', 'Sílex', 'Indeterminado', 'Núcleo', 'Núcleo',
  2.9, 3.4, 0.8, 39.809484, -7.23707,
  'Apresenta Desgaste', @img)

显示了1.000000000000和-1.00000000的正确值

enter image description here enter image description here

1 个答案:

答案 0 :(得分:4)

首先,float不可靠,您应该使用DECIMAL(x,y)来存储坐标。

第二件事,即使使用float,您的定义float(x,x)也不正确。基本上,这意味着十进制分隔符和NO十进制数字前有x个数字。尝试放置39.888时,会出现错误:

ERROR 1264 (22003) at line x: Out of range value for column 'Latitutde'

在某些配置上,这只是一个警告,它尝试将数字尽可能地接近允许的范围。那将是0.99999(9)-0.99999(9)。但是,由于浮点数不准确,因此将其读取为1.0-1.0

应为float(x,y),其中x是允许的位数,而y是十进制数字。


答案很简短:

例如:使用DECIMAL(8,6)可以使39.809484起作用-它总共有8位数字和6位小数。

通常,坐标应存储为:

lat-DECIMAL(10, 8),因为它可以在-90至+90度范围内

lng-DECIMAL(11, 8),因为它的范围可能在-180到+180度之间

相关问题