我似乎无法在sqlite或apsw文档中找到对以下行为的引用:
我有一个部分定义的表格并填充为:
CREATE TABLE GeoLoc (lat TEXT, lon TEXT);
INSERT INTO GeoLoc (lat, lon) VALUES ('-33.5533422', '151.23422');
使用apsw获取结果时:
SELECT lat FROM GeoLoc;
我为unicode
列获得了正确的lat
值类型。但是跑步:
SELECT lat FROM GeoLoc WHERE lat + 0 = lat + 0;
我改为float
类型!上面的示例很愚蠢,但在我的实际查询中,我使用lat
进行了一些计算,将其转换为浮点类型,但我不希望类型更改在我的查询中无处不在。
我存储时依赖lat
的确切值。转换为float时,it could change when cast back to string(参见第4.0节)。
注意:我得到了与python的sqlite3模块相同的结果,但不是来自以及sqlite3自己的命令行客户端。< / p>
答案 0 :(得分:2)
这是bug,在SQLite版本3.8.3中为introduced。 现在fixed。
答案 1 :(得分:0)
在这里回答我自己的问题。实际上当使用sqlite3 CAST
时,它似乎工作正常:
SELECT CAST(lat AS TEXT) FROM GeoLoc WHERE lat + 0 = lat + 0;
为了测试它,我使用了一个非常高精度的浮点(例如80个有效数字),并且上面逐字地返回。附加一个空字符串似乎也可以正常工作:
SELECT lat || '' FROM GeoLoc WHERE lat + 0 = lat + 0;
但是,我仍然想知道为什么默认行为是改变所有数据类型。至少从程序员的角度来看,这是不自然的。您只希望在使用点进行自动转换。