这是一个有趣的,它只发生在一个数据库文件中,而不是我拥有的任何其他文件。我解决了这个问题,但认为这很有趣。
我有一张桌子 -
<partial table>
CREATE TABLE [horsestats] (
[horseID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[name] VARCHAR(30) NULL,
[flatrating] INTEGER DEFAULT '0' NULL
);
表中的所有零值都是由默认值设置的,其他任何值都是由我的软件设置的。大约70%的记录具有值集。所以,如果我们运行这个 -
Select horsestats.flatrating FROM horsestats WHERE horsestats.flatrating<>0 ORDER BY horsestats.flatrating DESC LIMIT 20;
我们真的没想到 -
flatrating 0 0 0 etc
实际上只列出了0的值,输出中没有任何非零值。如果我们反转它,我们可能期望只列出不是0的值:
Select horsestats.flatrating FROM horsestats WHERE horsestats.flatrating=0 ORDER BY horsestats.flatrating DESC LIMIT 20;
但不,没有记录返回。
那么这个是什么让我们(这是我开始的地方,因为它是我的软件需要的第一套):
Select horsestats.flatrating FROM horsestats ORDER BY horsestats.flatrating DESC;
我打赌你错了。它得到了这个:
flatrating 0 0 0 0 130 128 127 126 125 124 124
正如我所说,这不会发生在我拥有的任何其他数据库或表格上。我现在要通过隐式将所有零值设置为零来修复它,我怀疑这会使它正确。
实际上,如果我跑的话,它没有:
UPDATE horsestats SET horsestats.flatrating='0' WHERE horsestats.flatrating='0';
问题仍然存在,因此看起来我必须将该数据库文件写为损坏。在这种情况下,它是可以的,因为我必须从软件预加载的其他地方加载大部分数据。
所以问题是为什么?
Sqlite可以做一个奇怪的ansi和数字排序组合吗?我唯一可以想到的是给出这个排序顺序而且这个表中的零值似乎并没有在数字上为零,尽管它一旦传递给我的软件就会按预期运行。
答案 0 :(得分:0)
我认为你的问题是你引用零 - 这使它成为一个字符串。做一个像这样的表:
CREATE TABLE [horsestats] (
[horseID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[name] VARCHAR(30) NULL,
[flatrating] INTEGER DEFAULT 0 NULL
);
它似乎有效。或者,运行update
命令的不带引号的版本:
UPDATE horsestats SET horsestats.flatrating=0 WHERE horsestats.flatrating='0';