summaryrefslogtreecommitdiffstats
path: root/www/different.html
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-05 17:28:19 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-05 17:28:19 +0000
commit18657a960e125336f704ea058e25c27bd3900dcb (patch)
tree17b438b680ed45a996d7b59951e6aa34023783f2 /www/different.html
parentInitial commit. (diff)
downloadsqlite3-upstream.tar.xz
sqlite3-upstream.zip
Adding upstream version 3.40.1.upstream/3.40.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'www/different.html')
-rw-r--r--www/different.html358
1 files changed, 358 insertions, 0 deletions
diff --git a/www/different.html b/www/different.html
new file mode 100644
index 0000000..8f315ce
--- /dev/null
+++ b/www/different.html
@@ -0,0 +1,358 @@
+<!DOCTYPE html>
+<html><head>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<link href="sqlite.css" rel="stylesheet">
+<title>Distinctive Features Of SQLite</title>
+<!-- path= -->
+</head>
+<body>
+<div class=nosearch>
+<a href="index.html">
+<img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0">
+</a>
+<div><!-- IE hack to prevent disappearing logo --></div>
+<div class="tagline desktoponly">
+Small. Fast. Reliable.<br>Choose any three.
+</div>
+<div class="menu mainmenu">
+<ul>
+<li><a href="index.html">Home</a>
+<li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a>
+<li class='wideonly'><a href='about.html'>About</a>
+<li class='desktoponly'><a href="docs.html">Documentation</a>
+<li class='desktoponly'><a href="download.html">Download</a>
+<li class='wideonly'><a href='copyright.html'>License</a>
+<li class='desktoponly'><a href="support.html">Support</a>
+<li class='desktoponly'><a href="prosupport.html">Purchase</a>
+<li class='search' id='search_menubutton'>
+<a href="javascript:void(0)" onclick='toggle_search()'>Search</a>
+</ul>
+</div>
+<div class="menu submenu" id="submenu">
+<ul>
+<li><a href='about.html'>About</a>
+<li><a href='docs.html'>Documentation</a>
+<li><a href='download.html'>Download</a>
+<li><a href='support.html'>Support</a>
+<li><a href='prosupport.html'>Purchase</a>
+</ul>
+</div>
+<div class="searchmenu" id="searchmenu">
+<form method="GET" action="search">
+<select name="s" id="searchtype">
+<option value="d">Search Documentation</option>
+<option value="c">Search Changelog</option>
+</select>
+<input type="text" name="q" id="searchbox" value="">
+<input type="submit" value="Go">
+</form>
+</div>
+</div>
+<script>
+function toggle_div(nm) {
+var w = document.getElementById(nm);
+if( w.style.display=="block" ){
+w.style.display = "none";
+}else{
+w.style.display = "block";
+}
+}
+function toggle_search() {
+var w = document.getElementById("searchmenu");
+if( w.style.display=="block" ){
+w.style.display = "none";
+} else {
+w.style.display = "block";
+setTimeout(function(){
+document.getElementById("searchbox").focus()
+}, 30);
+}
+}
+function div_off(nm){document.getElementById(nm).style.display="none";}
+window.onbeforeunload = function(e){div_off("submenu");}
+/* Disable the Search feature if we are not operating from CGI, since */
+/* Search is accomplished using CGI and will not work without it. */
+if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){
+document.getElementById("search_menubutton").style.display = "none";
+}
+/* Used by the Hide/Show button beside syntax diagrams, to toggle the */
+function hideorshow(btn,obj){
+var x = document.getElementById(obj);
+var b = document.getElementById(btn);
+if( x.style.display!='none' ){
+x.style.display = 'none';
+b.innerHTML='show';
+}else{
+x.style.display = '';
+b.innerHTML='hide';
+}
+return false;
+}
+var antiRobot = 0;
+function antiRobotGo(){
+if( antiRobot!=3 ) return;
+antiRobot = 7;
+var j = document.getElementById("mtimelink");
+if(j && j.hasAttribute("data-href")) j.href=j.getAttribute("data-href");
+}
+function antiRobotDefense(){
+document.body.onmousedown=function(){
+antiRobot |= 2;
+antiRobotGo();
+document.body.onmousedown=null;
+}
+document.body.onmousemove=function(){
+antiRobot |= 2;
+antiRobotGo();
+document.body.onmousemove=null;
+}
+setTimeout(function(){
+antiRobot |= 1;
+antiRobotGo();
+}, 100)
+antiRobotGo();
+}
+antiRobotDefense();
+</script>
+
+<h1 align=center>Distinctive Features Of SQLite</h1>
+
+<p>
+This page highlights some of the characteristics of SQLite that are
+unusual and which make SQLite different from many other SQL
+database engines.
+</p>
+
+<a name="zeroconfig"></a>
+<p><b>Zero-Configuration</b></p>
+<blockquote>
+ SQLite does not need to be "installed" before it is used.
+ There is no "setup" procedure. There is no
+ server process that needs to be started, stopped, or configured.
+ There is
+ no need for an administrator to create a new database instance or assign
+ access permissions to users.
+ SQLite uses no configuration files.
+ Nothing needs to be done to tell the system that SQLite is running.
+ No actions are required to recover after a system crash or power failure.
+ There is nothing to troubleshoot.
+ <p>
+ SQLite just works.
+ <p>
+ Other more familiar database engines run great once you get them going.
+ But doing the initial installation and configuration can be
+ intimidatingly complex.
+</blockquote>
+<a name="serverless"></a>
+<p><b>Serverless</b></p>
+<blockquote>
+ <p>
+ <i>(See also the <a href="serverless.html">serverless</a> documentation page.)</i>
+ <p>
+ Most SQL database engines are implemented as a separate server
+ process. Programs that want to access the database communicate
+ with the server using some kind of interprocess communication
+ (typically TCP/IP) to send requests to the server and to receive
+ back results. SQLite does not work this way. With SQLite, the
+ process that wants to access the database reads and writes
+ directly from the database files on disk. There is no intermediary
+ server process.
+ <p>
+ There are advantages and disadvantages to being serverless. The
+ main advantage is that there is no separate server process
+ to install, setup, configure, initialize, manage, and troubleshoot.
+ This is one reason why SQLite is a "zero-configuration" database
+ engine. Programs that use SQLite require no administrative support
+ for setting up the database engine before they are run. Any program
+ that is able to access the disk is able to use an SQLite database.
+ <p>
+ On the other hand, a database engine that uses a server can provide
+ better protection from bugs in the client application - stray pointers
+ in a client cannot corrupt memory on the server. And because a server
+ is a single persistent process, it is able control database access with
+ more precision, allowing for finer grain locking and better concurrency.
+ <p>
+ Most SQL database engines are client/server based. Of those that are
+ serverless, SQLite is the only one that this author knows of that
+ allows multiple applications to access the same database at the same time.
+</blockquote>
+<a name="onefile"></a>
+<p><b>Single Database File</b></p>
+<blockquote>
+ An SQLite database is a single ordinary disk file that can be located
+ anywhere in the directory hierarchy. If SQLite can read
+ the disk file then it can read anything in the database. If the disk
+ file and its directory are writable, then SQLite can change anything
+ in the database. Database files can easily be copied onto a USB
+ memory stick or emailed for sharing.
+ <p>
+ Other SQL database engines tend to store data as a large collection of
+ files. Often these files are in a standard location that only the
+ database engine itself can access. This makes the data more secure,
+ but also makes it harder to access. Some SQL database engines provide
+ the option of writing directly to disk and bypassing the filesystem
+ altogether. This provides added performance, but at the cost of
+ considerable setup and maintenance complexity.
+</blockquote>
+<a name="onefile"></a>
+<p><b>Stable Cross-Platform Database File</b></p>
+<blockquote>
+ The SQLite file format is cross-platform. A database file written
+ on one machine can be copied to and used on a different machine with
+ a different architecture. Big-endian or little-endian, 32-bit or
+ 64-bit does not matter. All machines use the same file format.
+ Furthermore, the developers have pledged to keep the file format
+ stable and backwards compatible, so newer versions of SQLite can
+ read and write older database files.
+ <p>
+ Most other SQL database engines require you to dump and restore
+ the database when moving from one platform to another and often
+ when upgrading to a newer version of the software.
+</blockquote>
+<a name="small"></a>
+<p><b>Compact</b></p>
+<blockquote>
+ When optimized for size, the whole SQLite library with everything enabled
+ is <a href="footprint.html">less than 500KiB in size</a>
+ (as measured on an ix86 using the "size"
+ utility from the GNU compiler suite.) Unneeded features can be disabled
+ at compile-time to further reduce the size of the library to under
+ 300KiB if desired.
+ <p>
+ Most other SQL database engines are much larger than this. IBM boasts
+ that its recently released CloudScape database engine is "only" a 2MiB
+ jar file - an order of magnitude larger than SQLite even after it is
+ compressed!
+ Firebird boasts that its client-side library is only 350KiB. That's
+ as big as SQLite and does not even contain the database engine.
+ The Berkeley DB library from Oracle is 450KiB and it omits SQL
+ support, providing the programmer with only simple key/value pairs.
+</blockquote>
+<a name="typing"></a>
+<p><b>Manifest typing</b></p>
+<blockquote>
+ Most SQL database engines use static typing. A datatype is associated
+ with each column in a table and only values of that particular datatype
+ are allowed to be stored in that column. SQLite relaxes this restriction
+ by using manifest typing.
+ In manifest typing, the datatype is a property of the value itself, not
+ of the column in which the value is stored.
+ SQLite thus allows the user to store
+ any value of any datatype into any column regardless of the declared type
+ of that column. (There are some exceptions to this rule: An INTEGER
+ PRIMARY KEY column may only store integers. And SQLite attempts to coerce
+ values into the declared datatype of the column when it can.)
+ <p>
+ As far as we can tell, the SQL language specification allows the use
+ of manifest typing. Nevertheless, most other SQL database engines are
+ statically typed and so some people
+ feel that the use of manifest typing is a bug in SQLite. But the authors
+ of SQLite feel very strongly that this is a feature. The use of manifest
+ typing in SQLite is a deliberate design decision which has proven in practice
+ to make SQLite more reliable and easier to use, especially when used in
+ combination with dynamically typed programming languages such as Tcl and
+ Python.
+</blockquote>
+<a name="flex"></a>
+<p><b>Variable-length records</b></p>
+<blockquote>
+ Most other SQL database engines allocated a fixed amount of disk space
+ for each row in most tables. They play special tricks for handling
+ BLOBs and CLOBs which can be of wildly varying length. But for most
+ tables, if you declare a column to be a VARCHAR(100) then the database
+ engine will allocate
+ 100 bytes of disk space regardless of how much information you actually
+ store in that column.
+ <p>
+ SQLite, in contrast, use only the amount of disk space actually
+ needed to store the information in a row. If you store a single
+ character in a VARCHAR(100) column, then only a single byte of disk
+ space is consumed. (Actually two bytes - there is some overhead at
+ the beginning of each column to record its datatype and length.)
+ <p>
+ The use of variable-length records by SQLite has a number of advantages.
+ It results in smaller database files, obviously. It also makes the
+ database run faster, since there is less information to move to and from
+ disk. And, the use of variable-length records makes it possible for
+ SQLite to employ manifest typing instead of static typing.
+</blockquote>
+<a name="readable"></a>
+<p><b>Readable source code</b></p>
+<blockquote>
+ The source code to SQLite is designed to be readable and accessible to
+ the average programmer. All procedures and data structures and many
+ automatic variables are carefully commented with useful information about
+ what they do. Boilerplate commenting is omitted.
+</blockquote>
+<a name="vdbe"></a>
+<p><b>SQL statements compile into virtual machine code</b></p>
+<blockquote>
+ Every SQL database engine compiles each SQL statement into some kind of
+ internal data structure which is then used to carry out the work of the
+ statement. But in most SQL engines that internal data structure is a
+ complex web of interlinked structures and objects. In SQLite, the compiled
+ form of statements is a short program in a machine-language like
+ representation. Users of the database can view this
+ <a href="opcode.html">virtual machine language</a>
+ by prepending the <a href="lang_explain.html">EXPLAIN</a> keyword
+ to a query.
+ <p>
+ The use of a virtual machine in SQLite has been a great benefit to the
+ library's development. The virtual machine provides a crisp, well-defined
+ junction between the front-end of SQLite (the part that parses SQL
+ statements and generates virtual machine code) and the back-end (the
+ part that executes the virtual machine code and computes a result.)
+ The virtual machine allows the developers to see clearly and in an
+ easily readable form what SQLite is trying to do with each statement
+ it compiles, which is a tremendous help in debugging.
+ Depending on how it is compiled, SQLite also has the capability of
+ tracing the execution of the virtual machine - printing each
+ virtual machine instruction and its result as it executes.
+</blockquote>
+<a name="license"></a>
+<p><b>Public domain</b></p>
+<blockquote>
+ The source code for SQLite is in the public domain. No claim of copyright
+ is made on any part of the core source code. (The documentation and test
+ code is a different matter - some sections of documentation and test logic
+ are governed by open-source licenses.) All contributors to the
+ SQLite core software have signed affidavits specifically disavowing any
+ copyright interest in the code. This means that anybody is able to legally
+ do anything they want with the SQLite source code.
+ <p>
+ There are other SQL database engines with liberal licenses that allow
+ the code to be broadly and freely used. But those other engines are
+ still governed by copyright law. SQLite is different in that copyright
+ law simply does not apply.
+ <p>
+ The source code files for other SQL database engines typically begin
+ with a comment describing your legal rights to view and copy that file.
+ The SQLite source code contains no license since it is not governed by
+ copyright. Instead of a license, the SQLite source code offers a blessing:
+ <blockquote>
+ <i>May you do good and not evil<br>
+ May you find forgiveness for yourself and forgive others<br>
+ May you share freely, never taking more than you give.</i>
+ </blockquote>
+</blockquote>
+<a name="extensions"></a>
+<p><b>SQL language extensions</b></p>
+<blockquote>
+ SQLite provides a number of enhancements to the SQL language
+ not normally found in other database engines.
+ The EXPLAIN keyword and manifest typing have already been mentioned
+ above. SQLite also provides statements such as
+ <a href="lang_replace.html">REPLACE</a> and the
+ <a href="lang_conflict.html">ON CONFLICT</a> clause that allow for
+ added control over the resolution of constraint conflicts.
+ SQLite supports <a href="lang_attach.html">ATTACH</a> and
+ <a href="lang_detach.html">DETACH</a> commands that allow multiple
+ independent databases to be used together in the same query.
+ And SQLite defines APIs which allow the user to add new
+ <a href="c3ref/create_function.html">SQL functions</a>
+ and <a href="c3ref/create_collation.html">collating sequences</a>.
+</blockquote>
+
+<p align="center"><small><i>This page last modified on <a href="https://sqlite.org/docsrc/honeypot" id="mtimelink" data-href="https://sqlite.org/docsrc/finfo/pages/different.in?m=95a3317bd2a3d0b7a">2022-01-20 21:38:08</a> UTC </small></i></p>
+