Super Sale WeekClaude Skills — 20% KORTING
Glossary

SQLite-bestanden uitgelegd: structuur, use cases en belangrijkste limieten

Powerdrill Bloom·
SQLite-bestanden uitgelegd: structuur, use cases en belangrijkste limieten

Een SQLite-bestand is een enkel schijfbestand dat een volledige relationele database bevat — tabellen, indexen en schema samen. De eigen documentatie van SQLite noemt het het "hoofddatabasebestand" en merkt op dat "de volledige status van een SQLite-database er meestal in is opgenomen". Het woord meestal doet hier belangrijk werk in die zin.

Als u ooit een .db-, .sqlite- of .sqlite3-bestand in handen heeft gekregen en zich afvroeg of u wel alle gegevens had ontvangen, is dit het formaat dat u goed moet begrijpen.

Wat een SQLite-bestand eigenlijk is

SQLite omschrijft zichzelf als "een in-process bibliotheek die een op zichzelf staande, serverloze, configuratievrije, transactionele SQL-database-engine implementeert." Dezelfde pagina vermeldt dat SQLite "geen afzonderlijk serverproces heeft." Een applicatie koppelt de bibliotheek en leest het bestand.

Hieruit volgen twee consequenties. Ten eerste reist de database als één artefact, wat de reden is waarom zoveel applicaties hun gegevens op deze manier verzenden. Ten tweede moet het formaat uiterst stabiel zijn, omdat die bestanden langer meegaan dan de software die ze heeft geschreven. SQLite noemt een "stabiel, duurzaam bestandsformaat" als een van de belangrijkste kenmerken. Er staat ook dat de code zich in het publieke domein bevindt, "vrij voor gebruik voor elk doel, commercieel of privé."

De schaal is gemakkelijk te onderschatten. De eigen 'over'-pagina van SQLite vermeldt dat het "de meest ingezette database ter wereld is, met meer applicaties dan we kunnen tellen."

Wat er in het bestand zit

De 100-byte header

De eerste bytes identificeren het formaat. Op offset 0 bevat het bestand een 16-byte header-string: SQLite format 3\000. Die handtekening is hoe tools het bestand herkennen, ongeacht de extensie.

Het volgende veld is belangrijker dan het lijkt. Op offset 16 bevindt zich een 2-byte integer die "de paginagrootte van de database in bytes" bevat. De documentatie vermeldt dat deze "een macht van twee moet zijn tussen 512 en 32768 inclusief, of de waarde 1 die een paginagrootte van 65536 vertegenwoordigt." Alle multibyte-velden in de header worden opgeslagen met de meest significante byte eerst.

Er volgen nog twee bytes op offsets 18 and 19: de schrijfversie en leesversie van het bestandsformaat. De documentatie merkt op dat de waarde "1 voor legacy; 2 voor WAL" is.

Pagina's, geen rijen

Onder de header is het bestand een stapel pagina's van vaste grootte. De specificatie is expliciet: "Het hoofddatabasebestand bestaat uit een of meer pagina's. De grootte van een pagina is een macht van twee tussen 512 en 65536 inclusief. Alle pagina's binnen dezelfde database hebben dezelfde grootte."

Pagina's zijn genummerd vanaf 1, en het maximale paginanummer is 4,294,967,294. Tabellen en indexen bevinden zich binnen die pagina's als B-tree-structuren, wat de reden is waarom een teksteditor u heel weinig laat zien.

De sidecar-bestanden die niemand noemt

Dit is het deel waar mensen vaak door verrast worden. De documentatie zegt dat de volledige status "meestal" in één bestand staat. Vervolgens wordt de uitzondering genoemd. Tijdens een transactie slaat SQLite "extra informatie op in een tweede bestand genaamd het 'rollback-journaal'." In WAL-modus is dat tweede bestand een write-ahead log.

Dus bij een kopie die is gemaakt terwijl de applicatie aan het schrijven is, kunnen er vastgelegde gegevens ontbreken die zich nog in het sidecar-bestand bevinden. Als een collega u een .db-bestand stuurt en niets anders, en de cijfers lijken enigszins verouderd, is dit het eerste wat u moet controleren.

Hoe u een SQLite-bestand opent

Er zijn drie manieren, en de juiste hangt af van wat u vervolgens wilt doen.

Lees het met een viewer. SQLite-viewers voor desktop en browser openen het bestand, tonen de tabellen en laten u door rijen klikken. Dit is de snelste manier om de vraag "wat zit hier eigenlijk in" te beantwoorden, en het is meestal voldoende voor een eerste blik.

Bezoek het met query's via de opdrachtregel of een bibliotheek. De sqlite3-shell en de standaardbibliotheekkoppelingen in Python, Node en de meeste andere talen lezen het formaat rechtstreeks. Dit is de route wanneer u het schema al kent en een specifiek getal wilt hebben.

Exporteer een tabel en analyseer deze elders. Dump een tabel naar CSV en importeer deze in de tool die uw team al gebruikt. U verliest de relaties tussen tabellen, wat juist hetgeen is dat het formaat beschermde. Exporteer waar mogelijk het samengevoegde resultaat in plaats van de ruwe tabellen.

Waarom een tool kan zeggen dat het bestand geen database is

De specificatie verklaart dit. Elk geldig bestand begint met een 16-byte header-string, SQLite format 3\000. Een lezer die een bestand opent en die handtekening niet vindt op offset 0, heeft geen SQLite-database gekregen.

Drie veelvoorkomende oorzaken dekken de meeste gevallen. Het bestand is onvolledig overgedragen, dus de header is er wel, maar de rest is afgebroken. Het bestand is versleuteld of verpakt door een applicatie, waardoor de eerste bytes iets anders zijn. Of de extensie is misleidend, en wat u werkelijk heeft ontvangen was een gewone export die door een behulpzaam iemand is hernoemd.

Hoe groot kan een SQLite-bestand worden

Groter dan de vraag meestal impliceert. De limietenpagina van SQLite vermeldt dat de maximale grootte van een databasebestand 4,294,967,294 pagina's is. Bij de maximale paginagrootte van 65,536 bytes is dat een maximale databasegrootte van ongeveer 281 terabytes.

De pagina is verfrissend eerlijk over dat cijfer. Er staat dat de bovengrens "ongetest is omdat de ontwikkelaars geen toegang hebben tot hardware die in staat is om deze limiet te bereiken."

Het aantal rijen is door dezelfde muur begrensd. Het theoretische maximum is 2^64 rijen in een tabel. De documentatie wijst erop dat deze limiet "onbereikbaar is omdat de maximale databasegrootte van 281 terabytes eerder zal worden bereikt."

Voor praktisch werk is de nuttige les juist het tegenovergestelde van een limiet. Als iemand u een .db-bestand overhandigt en waarschuwt dat het groot is, is het formaat vrijwel zeker niet wat u zal tegenhouden. De paginagrootte die is gekozen bij het maken van het bestand, en of het indexen bevat, zal de ervaring veel meer beïnvloeden dan welk gedocumenteerd plafond dan ook.

Waar u SQLite-bestanden tegenkomt

  • Applicatie-exports. Desktop- en mobiele apps slaan geschiedenis, instellingen en berichtenlogboeken vaak op in een SQLite-bestand dat u kunt kopiëren.
  • Analytische overdrachten. Engineers verzenden een momentopname als één bestand in plaats van dat ze toegang verlenen tot de database.
  • Apparaten en telemeterie. Embedded systemen schrijven lokaal omdat er geen server is om mee te communiceren.
  • Archieven. De langetermijnstabiliteit van het formaat maakt het een veelgebruikte keuze voor datasets die jarenlang leesbaar moeten blijven.
  • Interne werking van browsers en tools. Veel lokale tools houden hun status op deze manier bij, wat de reden is waarom de extensie vaak opduikt in supporttickets.

Waar de WAL- en journaalbestanden voor dienen

Misschien heeft u een .db-bestand gekopieerd en zag u een -wal- of een -journal-bestand ernaast staan. Dat zijn de sidecars die de specificatie beschrijft, en het verwijderen ervan is hoe mensen gegevens verliezen.

Het rollback-journaal is het oudere mechanisme. Voordat een pagina wordt gewijzigd, schrijft SQLite de originele versie van die pagina in het journaal. Als het schrijven wordt onderbroken, kan het origineel worden teruggezet, wat ervoor zorgt dat een transactie een crash overleeft.

Het write-ahead log draait de volgorde om. Wijzigingen gaan eerst naar het logboek en het hoofdbestand wordt later bijgewerkt. De header geeft aan in welke modus een database zich bevindt. De schrijfversie van het bestandsformaat op offset 18 is "1 voor legacy; 2 voor WAL."

De praktische regel volgt rechtstreeks uit de zin over de volledige status. Stel dat de database in WAL-modus staat en iemand u alleen het hoofdbestand overhandigt. De meest recente vastgelegde wijzigingen kunnen zich nog bevinden in het logboek dat u niet heeft ontvangen.

Dus wanneer u een databasebestand krijgt, stel dan twee vragen. Is de applicatie netjes afgesloten toen de kopie werd gemaakt, en is er nog iets anders meegeleverd? Beide antwoorden zijn meestal ja, en die ene keer dat dat niet zo is, is het moment waarop de cijfers stilletjes afwijken van de productieomgeving.

SQLite-bestand vs CSV vs Parquet

SQLite-bestand CSV Parquet
Vorm Meerdere tabellen, één bestand Eén tabel, één bestand Eén tabel, één bestand of map
Typen Opgeslagen met de gegevens Afgeleid door de lezer Opgeslagen met de gegevens
Relaties Behouden, via sleutels en indexen Verloren Verloren
Menselijk leesbaar Nee Ja Nee
Geschreven om te bevragen Ja, met SQL Nee Ja, door analyse-engines
Veelvoorkomend probleem Ontbrekend journaal- of WAL-sidecar-bestand Gissen naar type en scheidingsteken Ondersteuning van de toolchain

Als u regelmatig met deze formaten werkt, behandelen onze handleidingen over Parquet-bestanden en TSV-bestanden hetzelfde onderwerp voor die twee.

Waarom teams voor dit formaat kiezen

Niets om uit te voeren. Omdat SQLite "geen afzonderlijk serverproces heeft", is een overdracht een bestandskopie in plaats van een provisioningticket.

Typen overleven de reis. Een datumkolom komt aan als een datum. Iedereen die weleens heeft gezien hoe een CSV-lezer een identificatiecode verandert in wetenschappelijke notatie, begrijpt de waarde daarvan.

Relaties overleven ook. Verschillende gerelateerde tabellen blijven samen in één artefact, zodat de joins die de gegevens betekenisvol maakten nog steeds beschikbaar zijn.

Duurzaamheid is ingebouwd. SQLite noemt transacties "zelfs na stroomuitval" als een van de kernfuncties, wat de reden is waarom zoveel embedded software erop vertrouwt.

Limieten die het waard zijn om te weten

Eén bestand, één schrijver tegelijk. De engine is embedded in plaats van geserveerd, dus het concurrency-model is anders dan bij een client-server database. Dat is een ontwerpkeuze, geen defect, maar het bepaalt waar het bestand geschikt voor is.

Paginagrootte ligt vast bij aanmaak. Elke pagina in een database heeft dezelfde grootte, en die grootte is vastgelegd in de header. U kiest deze eenmalig.

Nogmaals de sidecar-regel. Elke kopieer-, back-up- of uploadroutine die alleen het hoofdbestand pakt, kan missen wat er in het journaal of het write-ahead log stond.

Ondoorzichtigheid. Een SQLite-bestand laat zich niet zo snel scannen als een CSV-bestand. Het lezen ervan vereist een tool, en dat is precies de drempel die veel analyses vertraagt.

Hoe u antwoorden krijgt uit een SQLite-bestand

De traditionele route is om een client te installeren, het bestand te openen, het schema te leren kennen en SQL te gaan schrijven. Dat is prima als u de tabellen al kent. Het is traag als u het bestand vanochtend heeft gekregen en de vergadering vanmiddag al is.

De kortere route is om de vraag rechtstreeks te stellen. Powerdrill Bloom lets you work with your data in natural language and returns an answer with its source attached. De homepage belooft dat "elk getal terugkomt met de pagina, de rij en het cijfer erachter." Van daaruit kan dezelfde werkruimte grafieken, sheets of een korte presentatie genereren.

Twee gerelateerde pagina's zijn de moeite waard om te kennen als dit uw vaste workflow is. Chat with Database behandelt de conversationele route naar gestructureerde gegevens, en Text to SQL behandelt het geval waarin u de query zelf wilt. Als uw overdracht in plaats daarvan als een platte export binnenkomt, behandelt de pagina CSV AI assistant dat pad.

Nog één ding dat de header u vertelt

Omdat de paginagrootte zich op een vaste offset bevindt, kunt u iets nuttigs over een bestand te weten komen voordat u het echt opent. Een database die is gemaakt met een pagina van 4,096 bytes gedraagt zich anders dan een database die is gemaakt met pagina's van 65,536 bytes. Die keuze is eenmalig gemaakt, toen het bestand werd gemaakt.

Het is geen getal dat u achteraf zomaar even aanpast. Het hoort in dezelfde mentale categorie thuis als een schema-beslissing, in plaats van een instelling.

Conclusion

Een SQLite-bestand is een hele database in één artefact. Het bevat een 16-byte handtekening, een paginagrootte vastgelegd op offset 16, en een stapel pagina's van vaste grootte die uw tabellen en indexen bevatten. Het reist gemakkelijk, behoudt zijn typen en blijft jarenlang leesbaar.

Onthoud het ene voorbehoud waar de specificatie voorzichtig mee is. De volledige status bevindt zich meestal in dat bestand. Tijdens een transactie bevindt een deel ervan zich in een rollback-journaal of een write-ahead log dat ernaast staat. Controleer op de aanwezigheid van de sidecar voordat u de kopie vertrouwt.

Wanneer u het bestand heeft en het antwoord nodig heeft in plaats van het schema, probeer dan Powerdrill Bloom en stel uw vraag rechtstreeks aan de gegevens.

Veelgestelde vragen

Wat is het verschil tussen .db, .sqlite en .sqlite3?

Niets structureels. Alle drie zijn het gebruikelijke extensies voor hetzelfde formaat, en de werkelijke identificatie is de 16-byte header-string SQLite format 3\000 aan het begin van het bestand.

Hoe weet ik welke paginagrootte een SQLite-bestand gebruikt?

Dit is vastgelegd in de header. Een 2-byte integer op offset 16 bevat de paginagrootte in bytes. Deze moet een macht van twee zijn tussen 512 en 32768, of de waarde 1 die 65536 vertegenwoordigt.

Is een SQLite-bestand de volledige database?

Meestal wel, maar niet altijd. De documentatie vermeldt dat SQLite tijdens een transactie extra informatie bijhoudt in een rollback-journaal. In WAL-modus gaat die informatie in plaats daarvan naar een write-ahead log.

Kan ik een SQLite-bestand openen in Excel?

Niet rechtstreeks, omdat het bestand B-tree-pagina's opslaat in plaats van tekstrijen. De gebruikelijke weg is om een tabel eerst naar CSV te exporteren, of om een tool te gebruiken die het databaseformaat leest en resultaten retourneert.

Is SQLite gratis te gebruiken voor commerciële doeleinden?

Ja. SQLite vermeldt dat de code zich in het publieke domein bevindt en "vrij is voor gebruik voor elk doel, commercieel of privé."