数据库和代码程序间的数据类型选择

来源:互联网 发布:python socket通信框架 编辑:程序博客网 时间:2024/06/01 16:56
今天在看自己项目组数据的时候,在sql server数据库里有一个保存Site(站点)信息的表,其中有Latitude(纬度)
和Longitude(经度)这两个字段,发现类型为float。 大家都知道sql的float(8字节)和real(4字节,=float(24)
类型都是表示数据的近似值,我想如果程序代码中若有判断地图范围或按地图范围来查Site时,必然用到Latitude和
Longitude的大小比较,那这样肯定就会做出不精确的判断了。
于是立即去查代码,果然,就有这样的 >= 和 <= 的判断; 并且更可恨的是,所有这些site的点都是要显示到BingMap
上去的,我想拿一个近似值去显示一个错误的点,这是大家都不想要的结果。
好吧,去找DBA。DBA解释到,这个只要确保在存的这些数据小数点尾数全部一致位,这里为后6,然后我们在代码中
也可以只保留小数点后六位,需求上也是能容许地图显示的小误差的。自然,有点道理。
不过他后来问我代码里接受的Latitude和Longitude参数是用什么类型来表示的,我这才想起是用的double,并且有两点
之间距离的计算。 这完全是糟糕的设计啊! 数据库的float型取出之后赋给double,会在后面多出几位,本身数值也有

出入,还用来计算球面距离,那准确度就大打折扣了。并且double类型计算效率很低。


比较好的改正方法是
1. 数据库里Lat/Lon类型改成int。也就是原来的float的值乘以1e6。
2. 代码的数据类型也改成int,等真正用时除以1e6即可!

结论
1. 数据库和代码里的类型尽量用int,尤其是涉及到数值运算的。
2. 数据库取出的数据应尽量保持其本性,到真正用时才做转换,也就是:只做一次近似运算!