2013-03-14 28 views
0

我正在使用SQLite3 in .cpp,我正在使用std::map<std::string, special_variant_type>来存储行。一切都很好,但我发现列名似乎保留包装当我SELECT(subqueries)SQLite3:列名中出现意外的包装时(子查询)

比较这些查询:

SELECT `name` FROM `sqlite_master` WHERE `type`='table'; // works as I expected 

(随便选)

// do not work as I expected but might work as expected... 
SELECT `name` FROM (SELECT `name` FROM `sqlite_master` WHERE `type`='table'); 
SELECT [name] FROM (SELECT `name` FROM `sqlite_master` WHERE `type`='table'); 

ISSUE:一是一个未经修饰带来了列名。所以,列名是name。对于第二个从子查询中进行选择的列名是不变的。返回backticks, square brackets [], double quotes " ...任何名称包装应该是... IMO,丢弃。

这是预期的行为?似乎不一致,要么保持包装或丢弃......

PS我现在抛弃他们,当我配对的列映射,还是......我想知道如果这是正确的。 ..

PPS它发生在sqlite3库和Navicat客户端。

快速解决方案:3.7.14已损坏。更新您的客户到一个新版本!更换第三方软件中的DLL(但保留备份副本以防万一)也有此问题。

回答

0

似乎是一致的:

$ sqlite3 
SQLite version 3.7.15.2 2013-01-09 11:53:05 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> create table test(x); 
sqlite> .headers on 
sqlite> .mode columns 
sqlite> SELECT `name` FROM `sqlite_master` WHERE `type`='table'; 
name 
---------- 
test 
sqlite> SELECT `name` FROM (SELECT `name` FROM `sqlite_master` WHERE `type`='table'); 
name 
---------- 
test 

总之,SQLite的使有关列名没有保证。

要在结果中强制列名,请使用AS来定义别名。

访问列的最可靠方法是通过它们的索引,从而避免使用公式或重复列名的问题。

+0

好:)更新SQLite客户端中的DLL,现在它正常工作。认为这是一个错误,但谷歌在这一个失败。必须重新编译我正在使用的那个(3.7.14),因为它在3.7.15中已经修复。 – CodeAngry 2013-03-15 14:41:04