2017-08-15 135 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

喔,非常感謝你!所以第一行也是相關的。這就解釋了爲什麼在列表末尾追加信息沒有做任何事情。我可以使用這個,非常感謝。 –