394 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			394 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!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>SQLite Version 3 Overview</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;
 | 
						|
}
 | 
						|
</script>
 | 
						|
</div>
 | 
						|
 | 
						|
 | 
						|
<p>
 | 
						|
<center><table border="1" cellpadding="10" width="75%">
 | 
						|
<tr><td bgcolor="#ffffbb">
 | 
						|
<b>Editorial Note:</b>
 | 
						|
This document was written in 2004 as a guide to programmers who were
 | 
						|
transitioning from SQLite2 to SQLite3.
 | 
						|
It is retained as part of the historical record of SQLite.
 | 
						|
Modern programmers should refer to
 | 
						|
more up-to-date documentation on SQLite available elsewhere
 | 
						|
on this website.
 | 
						|
</table></center>
 | 
						|
 | 
						|
<h2>SQLite Version 3 Overview</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
SQLite version 3.0 introduces important changes to the library, including:
 | 
						|
</p>
 | 
						|
 | 
						|
<ul>
 | 
						|
<li>A more compact format for database files.</li>
 | 
						|
<li>Manifest typing and BLOB support.</li>
 | 
						|
<li>Support for both UTF-8 and UTF-16 text.</li>
 | 
						|
<li>User-defined text collating sequences.</li>
 | 
						|
<li>64-bit ROWIDs.</li>
 | 
						|
<li>Improved Concurrency.</li>
 | 
						|
</ul>
 | 
						|
 | 
						|
<p>
 | 
						|
This document is a quick introduction to the changes for SQLite 3.0
 | 
						|
for users who are already familiar with SQLite version 2.8.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Naming Changes</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
SQLite version 2.8 will continue to be supported with bug fixes
 | 
						|
for the foreseeable future.  In order to allow SQLite version 2.8
 | 
						|
and SQLite version 3.0 to peacefully coexist, the names of key files
 | 
						|
and APIs in SQLite version 3.0 have been changed to include the
 | 
						|
character "3".  For example, the include file used by C programs
 | 
						|
has been changed from "sqlite.h" to "sqlite3.h".  And the name of
 | 
						|
the shell program used to interact with databases has been changed
 | 
						|
from "sqlite.exe" to "sqlite3.exe".  With these changes, it is possible
 | 
						|
to have both SQLite 2.8 and SQLite 3.0 installed on the same system at
 | 
						|
the same time.  And it is possible for the same C program to link
 | 
						|
against both SQLite 2.8 and SQLite 3.0 at the same time and to use
 | 
						|
both libraries at the same time.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>New File Format</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
The format used by SQLite database files has been completely revised.
 | 
						|
The old version 2.1 format and the new 3.0 format are incompatible with
 | 
						|
one another.  Version 2.8 of SQLite will not read a version 3.0 database
 | 
						|
files and version 3.0 of SQLite will not read a version 2.8 database file.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
To convert an SQLite 2.8 database into an SQLite 3.0 database, have
 | 
						|
ready the command-line shells for both version 2.8 and 3.0.  Then
 | 
						|
enter a command like the following:
 | 
						|
</p>
 | 
						|
 | 
						|
<blockquote><pre>
 | 
						|
sqlite OLD.DB .dump | sqlite3 NEW.DB
 | 
						|
</pre></blockquote>
 | 
						|
 | 
						|
<p>
 | 
						|
The new database file format uses B+trees for tables.  In a B+tree, all
 | 
						|
data is stored in the leaves of the tree instead of in both the leaves and
 | 
						|
the intermediate branch nodes.  The use of B+trees for tables allows for
 | 
						|
better scalability and the storage of larger data fields without the use of
 | 
						|
overflow pages.  Traditional B-trees are still used for indices.</p>
 | 
						|
 | 
						|
<p>
 | 
						|
The new file format also supports variable pages sizes between 512 and
 | 
						|
65536 bytes.  The size of a page is stored in the file header so the
 | 
						|
same library can read databases with different pages sizes, in theory,
 | 
						|
though this feature has not yet been implemented in practice.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
The new file format omits unused fields from its disk images.  For example,
 | 
						|
indices use only the key part of a B-tree record and not the data.  So
 | 
						|
for indices, the field that records the length of the data is omitted.
 | 
						|
Integer values such as the length of key and data are stored using
 | 
						|
a variable-length encoding so that only one or two bytes are required to
 | 
						|
store the most common cases but up to 64-bits of information can be encoded
 | 
						|
if needed. 
 | 
						|
Integer and floating point data is stored on the disk in binary rather
 | 
						|
than being converted into ASCII as in SQLite version 2.8.
 | 
						|
These changes taken together result in database files that are typically
 | 
						|
25% to 35% smaller than the equivalent files in SQLite version 2.8.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
Details of the low-level B-tree format used in SQLite version 3.0 can
 | 
						|
be found in header comments to the 
 | 
						|
<a href="http://www.sqlite.org/src/finfo?name=src/btreeInt.h">btreeInt.h</a>
 | 
						|
source file and in the <a href="fileformat2.html">file format</a> documentation.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Manifest Typing and BLOB Support</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
SQLite version 2.8 will deal with data in various formats internally,
 | 
						|
but when writing to the disk or interacting through its API, SQLite 2.8
 | 
						|
always converts data into ASCII text.  SQLite 3.0, in contrast, exposes 
 | 
						|
its internal data representations to the user and stores binary representations
 | 
						|
to disk when appropriate.  The exposing of non-ASCII representations was
 | 
						|
added in order to support BLOBs.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
SQLite version 2.8 had the feature that any type of data could be stored
 | 
						|
in any table column regardless of the declared type of that column.  This
 | 
						|
feature is retained in version 3.0, though in a slightly modified form.
 | 
						|
Each table column will store any type of data, though columns have an
 | 
						|
affinity for the format of data defined by their declared datatype.
 | 
						|
When data is inserted into a column, that column will make an attempt
 | 
						|
to convert the data format into the column's declared type.   All SQL
 | 
						|
database engines do this.  The difference is that SQLite 3.0 will 
 | 
						|
still store the data even if a format conversion is not possible.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
For example, if you have a table column declared to be of type "INTEGER"
 | 
						|
and you try to insert a string, the column will look at the text string
 | 
						|
and see if it looks like a number.  If the string does look like a number
 | 
						|
it is converted into a number and into an integer if the number does not
 | 
						|
have a fractional part, and stored that way.  But if the string is not
 | 
						|
a well-formed number it is still stored as a string.  A column with a
 | 
						|
type of "TEXT" tries to convert numbers into an ASCII-Text representation
 | 
						|
before storing them.  But BLOBs are stored in TEXT columns as BLOBs because
 | 
						|
you cannot in general convert a BLOB into text.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
In most other SQL database engines the datatype is associated with
 | 
						|
the table column that holds the data - with the data container.
 | 
						|
In SQLite 3.0, the datatype is associated with the data itself, not
 | 
						|
with its container.
 | 
						|
<a href="http://www.paulgraham.com/">Paul Graham</a> in his book 
 | 
						|
<i><a href="http://www.paulgraham.com/acl.html">ANSI Common Lisp</a></i></a>
 | 
						|
calls this property "Manifest Typing".
 | 
						|
Other writers have other definitions for the term "manifest typing",
 | 
						|
so beware of confusion.  But by whatever name, that is the datatype
 | 
						|
model supported by SQLite 3.0.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
Additional information about datatypes in SQLite version 3.0 is
 | 
						|
available
 | 
						|
<a href="datatype3.html">separately</a>.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Support for UTF-8 and UTF-16</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
The new API for SQLite 3.0 contains routines that accept text as
 | 
						|
both UTF-8 and UTF-16 in the native byte order of the host machine.
 | 
						|
Each database file manages text as either UTF-8, UTF-16BE (big-endian),
 | 
						|
or UTF-16LE (little-endian).  Internally and in the disk file, the
 | 
						|
same text representation is used everywhere.  If the text representation
 | 
						|
specified by the database file (in the file header) does not match
 | 
						|
the text representation required by the interface routines, then text
 | 
						|
is converted on-the-fly.
 | 
						|
Constantly converting text from one representation to another can be
 | 
						|
computationally expensive, so it is suggested that programmers choose a
 | 
						|
single representation and stick with it throughout their application.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
In the current implementation of SQLite, the SQL parser only works
 | 
						|
with UTF-8 text.  So if you supply UTF-16 text it will be converted.
 | 
						|
This is just an implementation issue and there is nothing to prevent
 | 
						|
future versions of SQLite from parsing UTF-16 encoded SQL natively.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
When creating new user-defined SQL functions and collating sequences,
 | 
						|
each function or collating sequence can specify if it works with
 | 
						|
UTF-8, UTF-16be, or UTF-16le.  Separate implementations can be registered
 | 
						|
for each encoding.   If an SQL function or collating sequence is required
 | 
						|
but a version for the current text encoding is not available, then 
 | 
						|
the text is automatically converted.  As before, this conversion takes
 | 
						|
computation time, so programmers are advised to pick a single
 | 
						|
encoding and stick with it in order to minimize the amount of unnecessary
 | 
						|
format juggling.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
SQLite is not particular about the text it receives and is more than
 | 
						|
happy to process text strings that are not normalized or even
 | 
						|
well-formed UTF-8 or UTF-16.  Thus, programmers who want to store
 | 
						|
ISO8859 data can do so using the UTF-8 interfaces.  As long as no
 | 
						|
attempts are made to use a UTF-16 collating sequence or SQL function,
 | 
						|
the byte sequence of the text will not be modified in any way.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>User-defined Collating Sequences</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
A collating sequence is just a defined order for text.  When SQLite 3.0
 | 
						|
sorts (or uses a comparison operator like "<" or ">=") the sort
 | 
						|
order is first determined by the data type.
 | 
						|
</p>
 | 
						|
 | 
						|
<ul>
 | 
						|
<li>NULLs sort first</li>
 | 
						|
<li>Numeric values sort next in numerical order</li>
 | 
						|
<li>Text values come after numerics</li>
 | 
						|
<li>BLOBs sort last</li>
 | 
						|
</ul>
 | 
						|
 | 
						|
<p>
 | 
						|
Collating sequences are used for comparing two text strings.
 | 
						|
The collating sequence does not change the ordering of NULLs, numbers,
 | 
						|
or BLOBs, only text.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
A collating sequence is implemented as a function that takes the
 | 
						|
two strings being compared as inputs and returns negative, zero, or
 | 
						|
positive if the first string is less than, equal to, or greater than
 | 
						|
the second.
 | 
						|
SQLite 3.0 comes with a single built-in collating sequence named "BINARY"
 | 
						|
which is implemented using the memcmp() routine from the standard C library.
 | 
						|
The BINARY collating sequence works well for English text.  For other
 | 
						|
languages or locales, alternative collating sequences may be preferred.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
The decision of which collating sequence to use is controlled by the
 | 
						|
COLLATE clause in SQL.  A COLLATE clause can occur on a table definition,
 | 
						|
to define a default collating sequence to a table column, or on field
 | 
						|
of an index, or in the ORDER BY clause of a SELECT statement.
 | 
						|
Planned enhancements to SQLite are to include standard CAST() syntax
 | 
						|
to allow the collating sequence of an expression to be defined.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>64-bit ROWIDs</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
Every row of a table has a unique rowid.
 | 
						|
If the table defines a column with the type "INTEGER PRIMARY KEY" then that
 | 
						|
column becomes an alias for the rowid.  But with or without an INTEGER PRIMARY
 | 
						|
KEY column, every row still has a rowid.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
In SQLite version 3.0, the rowid is a 64-bit signed integer.
 | 
						|
This is an expansion of SQLite version 2.8 which only permitted
 | 
						|
rowids of 32-bits.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
To minimize storage space, the 64-bit rowid is stored as a variable length
 | 
						|
integer.  Rowids between 0 and 127 use only a single byte.  
 | 
						|
Rowids between 0 and 16383 use just 2 bytes.  Up to 2097152 uses three
 | 
						|
bytes.  And so forth.  Negative rowids are allowed but they always use
 | 
						|
nine bytes of storage and so their use is discouraged.  When rowids
 | 
						|
are generated automatically by SQLite, they will always be non-negative.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Improved Concurrency</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
SQLite version 2.8 allowed multiple simultaneous readers or a single
 | 
						|
writer but not both.  SQLite version 3.0 allows one process to begin
 | 
						|
writing the database while other processes continue to read.  The
 | 
						|
writer must still obtain an exclusive lock on the database for a brief
 | 
						|
interval in order to commit its changes, but the exclusive lock is no
 | 
						|
longer required for the entire write operation.
 | 
						|
A <a href="lockingv3.html">more detailed report</a> on the locking
 | 
						|
behavior of SQLite version 3.0 is available separately.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
A limited form of table-level locking is now also available in SQLite.
 | 
						|
If each table is stored in a separate database file, those separate
 | 
						|
files can be attached to the main database (using the ATTACH command)
 | 
						|
and the combined databases will function as one.  But locks will only
 | 
						|
be acquired on individual files as needed.  So if you redefine "database"
 | 
						|
to mean two or more database files, then it is entirely possible for
 | 
						|
two processes to be writing to the same database at the same time.
 | 
						|
To further support this capability, commits of transactions involving
 | 
						|
two or more ATTACHed database are now atomic.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Credits</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
SQLite version 3.0 is made possible in part by AOL developers
 | 
						|
supporting and embracing great Open-Source Software.
 | 
						|
</p>
 | 
						|
 |