我已经在研究这个问题,但所有的结果只是命名sqlite的.width函数,或者参考pragma和类似的来找出隐藏的值。 问题是:我有一个数据库,我在" .mode列"和" .headers on"下以各种方式查询。所有列宽度的规则似乎都是10,或列的标题长度,具体取决于哪个更大。(..即使没有显示标题也是如此) 现在,数据库中现在约2个表中的一些列具有更长的列宽,因此它们完全匹配数据的长度(...而不是标题)。
例如,我有一个" date"显然只有4个符号的列,因此列宽应默认为10,而是扩展为15以适合长日期代码,如" 636363515212222"。 所以我想,也许长整数也会扩展这个,但是在另一个例子中,我得到了" uuid"仅使用文本字符串作为数据,最多可达34个字符。
注意,在基本上每个其他有文本或大整数(我测试过)的例子中,数据的输出都会被截断以适应列宽,例如
SomeLongNames
..............
"Herbert Wate
我还尝试将其中一个长的uuid条目复制到另一个表中,只是为了查看宽度是否会因某种原因自动适应这种形式的输入。它没有,并且uuid被截断了。 因此,这里留下的唯一结论是表格本身包含一些列的自定义格式,但我完全无法找到它们。 我试过了:
"架构(表)"确实给出了create table语句,但没有任何其他格式的迹象。
" pragma table_info(table_name)"它列出了类型,但没有varchar(任何地方!)或其他东西可以解释任何效果。
"从sqlite_master"中选择*做其他人的混合,但不再包含。
" .WIDTH"如果我无法通过上述命令找到该信息,则不会为某些表提供仅为某些表指定列宽的选项。
现在我的问题是:这是怎么回事?不知何故,这些表必须像这样结束。可能它们是在其他sql类型中创建的?(我只是在分析数据库以学习python编程访问) 但是,即使在这种情况下,sqlite也必须知道,所以在所有这些中必须有某种格式指针。 ......但是在哪里?
我非常需要这个btw。在进行远程sql-queries时使python输出看起来一致。除了没有触及那些便宜的特定列之外,没办法解决这个问题。
答案 0 :(得分: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 : " ");
}
}