我正在使用SQLite3 in .cpp,并使用std::map<std::string, special_variant_type>存储行。这一切都很好,但我发现,当我从SELECT从(subqueries)获得时,列名似乎保留了包装器。
比较以下查询:
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');问题:第一个会带来未修饰的列名。因此,列名是name。对于第二个从子查询中选择的列,列名不受影响。返回backticks, square brackets [], double quotes "..。任何应该是..。海事组织被丢弃了。
这是预期的行为吗?看起来不一致,要么保存包装,要么丢弃它们。
PS:我现在在对列映射时丢弃它们,不过.我想知道这是否正确..。
PPS:它同时发生在sqlite3库和Navicat客户机中。
快速解决方案:3.7.14坏了。更新你的客户到一个新版本!替换第三方软件中的DLL(但保留备份副本以防万一)也有此问题。
发布于 2013-03-15 09:04:20
似乎是一致的:
$ 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定义别名。
访问列的最可靠方法是通过它们的索引,从而避免公式或重复列名的问题。
https://stackoverflow.com/questions/15417165
复制相似问题