sqlite 列数据类型受在其他地方使用的影响

kq0g1dla  于 2022-12-27  发布在  SQLite
关注(0)|答案(2)|浏览(170)

在SQLite或apsw文档中,我似乎找不到对以下行为的引用:
我有一个部分定义的表,并填充为:

CREATE TABLE GeoLoc (lat TEXT, lon TEXT);
INSERT INTO GeoLoc (lat, lon) VALUES ('-33.5533422', '151.23422');

使用apsw获取以下结果时:

SELECT lat FROM GeoLoc;

我得到了lat列的正确的unicode值类型,但是运行:

SELECT lat FROM GeoLoc WHERE lat + 0 = lat + 0;

上面的例子很傻,但是在我的实际查询中,我用lat做了一些计算,把它变成了浮点类型,但是我不希望在我的查询中 * 到处 * 都改变类型。
我依赖于存储时lat的精确值。当转换为浮点型时,it could change when cast back to string(参见第4.0节)。
注意:我用Python的SQLite3模块得到了相同的结果,但是 * 不是 * 来自SQLite3自己的命令行客户端。

iovurdzv

iovurdzv1#

这是一个bug,在SQLite版本3.8.3中是introduced,现在是fixed

6fe3ivhb

6fe3ivhb2#

在这里回答我自己的问题。实际上当使用sqlite3 CAST时,它似乎工作得很好:

SELECT CAST(lat AS TEXT) FROM GeoLoc WHERE lat + 0 = lat + 0;

为了测试它,我使用了一个非常高精度的浮点数(例如80位有效数字),上面的代码原封不动地返回了它,追加一个空字符串似乎也能工作:

SELECT lat || '' FROM GeoLoc WHERE lat + 0 = lat + 0;

但是,我仍然想知道为什么默认行为是改变整个数据类型。至少从程序员的Angular 来看,这是不自然的。您只希望在使用点发生自动转换。

相关问题