2017-08-15 127 views
-2

我已经在研究这个问题了,但是所有的结果都只是名字的sqlite的.width函数,或者参考杂注和类似的来找出隐藏的值。 问题是这样的:我有一个数据库,我在“.mode列”和“.headers on”下以各种方式查询数据库。所有列的宽度规则似乎是10或列的标题长度,具体取决于哪个更大(即使标题未显示,也是如此) 现在,某些列在 - 因为现在 - 数据库中的两个表具有较长的列宽度,所以它们完全匹配数据的长度(而不是标题)。Sqlite3隐藏的列格式

例如我有一个明显只有4个符号的“日期”列,所以列宽应该默认为10,但是它会扩展到15以适应长日期代码,如“636363515212222”。 所以我想,也许长整数扩大了这一点,但在另一个例子中,我用纯粹的文本字符串作为数据得到了“uuid”,长达34个字符左右。

注意,在基本上在有文本或甚大的整数(我测试)每隔一个示例中,数据的输出将被简单地截断以适应列的宽度,像

SomeLongNames .............. "Herbert Wate

我还尝试将其中一个长uuid条目复制到另一个表中,只是为了查看宽度是否会由于某种原因自动适应这种输入形式。它没有,并且uuid被截断了。 所以这里唯一的结论是表格本身包含一些列的自定义格式,但我完全无法找到这些。 我想:

  • “的模式(表)”确实给create table语句,但目前还没有任何其他格式的迹象。

  • “pragma table_info(table_name)”列出了类型,但没有varchar(任何地方!)或其他东西可以看出来解释任何效果。

  • “select * from sqlite_master”做了两个其他的混合,但只包含其他内容。

  • “.width”不给出仅为某些表指定列宽的选项,无论该信息甚至存储在哪个问题中,如果我无法通过上述命令找到它的话。

所以我现在的问题:这是怎么回事?不知怎的,桌子肯定是这样结束的。可能它们是在其他sql类型中创建的(我只是分析数据库以学习python编程访问) 然而,即使在这种情况下,sqlite也必须知道,所以这里必须有某种格式化指针。 ...但是哪里?

我非常需要这个顺便说一句。在执行远程SQL查询时使python输出看起来一致。没有办法绕过这些,而不是触及那些便宜的专栏。

回答

0

数据库中没有存储格式化信息。

sqlite3命令行shell试图从列名和第一行的值自动检测列的宽度与此代码:

for(i=0; i<nArg; i++){ 
     int w, n; 
     if(i<ArraySize(p->colWidth)){ 
     w = colWidth[i]; 
     }else{ 
     w = 0; 
     } 
     if(w==0){ 
     w = strlenChar(azCol[i] ? azCol[i] : ""); 
     if(w<10) w = 10; 
     n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue); 
     if(w<n) w = n; 
     } 
     if(i<ArraySize(p->actualWidth)){ 
     p->actualWidth[i] = w; 
     } 
     if(showHdr){ 
     utf8_width_print(p->out, w, azCol[i]); 
     utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); 
     } 
    } 
    if(showHdr){ 
     for(i=0; i<nArg; i++){ 
     int w; 
     if(i<ArraySize(p->actualWidth)){ 
      w = p->actualWidth[i]; 
      if(w<0) w = -w; 
     }else{ 
      w = 10; 
     } 
     utf8_printf(p->out,"%-*.*s%s",w,w, 
       "----------------------------------------------------------" 
       "----------------------------------------------------------", 
       i==nArg-1 ? rowSep : " "); 
     } 
    } 
+0

喔,非常感谢你!所以第一行也是相关的。这就解释了为什么在列表末尾追加信息没有做任何事情。我可以使用这个,非常感谢。 –