2012-03-21 33 views
0

我发现似乎是一个奇怪的错误与sqlite。sqlite文本列名相同的价值bug

我有一个表

CREATE TABLE controller(id INTEGER PRIMARY KEY ASC, controller_number TEXT, password TEXT); 

随着数据

INSERT INTO controller (controller_number, password) VALUES ("1234", 1234); 

没有问题存在,但检查了这一点。

sqlite> SELECT * FROM controller; 
1|1234|1234 
sqlite> UPDATE controller SET controller_number="12345", password="password" WHERE id=1; 
sqlite> SELECT * FROM controller; 
1|12345|1234 

任何人都可以解释为什么会发生这种情况,或者这是一个应该提出的错误?

+0

它工作瓦特/单引号? – Sid 2012-03-22 16:11:38

+0

我同意Sid,我的测试表明这个问题与SQLite语言规范中的错误使用引号有关。 – 2012-05-03 18:12:36

回答

0
>CREATE TABLE controller(id INTEGER PRIMARY KEY ASC, controller_number TEXT, password TEXT); 
>INSERT INTO controller (controller_number, password) VALUES ("1234", 1234); 
>SELECT * FROM controller; 
1|1234|1234 
>UPDATE controller SET controller_number="12345", password="password" WHERE id=1; 
>SELECT * FROM controller; 
1|12345|1234 

以上会导致一个问题,但如果这样做

>UPDATE controller SET controller_number='123456', password='password' WHERE id=1; 

我得到这个

>SELECT * FROM controller; 
1|123456|password 

很清楚是怎么回事时,第一次更新是设置密码=密码,而不是passw ord =“密码”,第二个查询执行正确的方式。

任何人都可以详细说明为什么发生这种情况,还是应该首先发生?

+0

阅读本文,它将有所帮助:http://www.sqlite.org/lang_keywords.html – 2012-05-03 18:14:10

2

这可能是双引号:

“关键字”单引号中的关键字是一个字符串文字。 “keyword”双引号中的关键字是一个标识符。

http://www.sqlite.org/lang_keywords.html

+0

我不认为我这样做。 INSERT不是问题。正如你应该能够从上面的代码中看到的那样,INSERT向表格添加一行罚款。 UPDATE只更新controller_number列并保持密码列不变。看起来该查询已经在数据库上运行,并且没有返回错误。但是,SELECT语句显示查询实际上未能更新密码列。当密码列的值与列名匹配时,这只是一个问题。 – Ne0 2012-03-22 11:17:13

+0

所以如果你将列值更改为别的东西,它工作正常吗? – Sid 2012-03-22 14:49:31

+0

是的,这是正确的。 “更新控制器SET controller_number =”12345“,密码=”54321“WHERE id = 1;”工程和两个领域得到更新。我用其他字段名称测试过它,问题似乎是TEXT字段,其值与列名称相同。例如。更新控制器SET controller_number =“controller_number”,密码=“54321”;结果为1 | 07725686891 | 54321 – Ne0 2012-03-22 15:35:48