Documentation Source Text

Hex Artifact Content
Login

Artifact 442c1af8c8e5676b9f0ccc0181714d321fb9daa96774ecdc12b963fff749b991:


0000: 3c 74 69 74 6c 65 3e 51 75 69 72 6b 73 2c 20 43  <title>Quirks, C
0010: 61 76 65 61 74 73 2c 20 61 6e 64 20 47 6f 74 63  aveats, and Gotc
0020: 68 61 73 20 49 6e 20 53 51 4c 69 74 65 3c 2f 74  has In SQLite</t
0030: 69 74 6c 65 3e 0a 3c 74 63 6c 3e 68 64 5f 6b 65  itle>.<tcl>hd_ke
0040: 79 77 6f 72 64 73 20 7b 51 75 69 72 6b 73 7d 3c  ywords {Quirks}<
0050: 2f 74 63 6c 3e 0a 0a 3c 74 61 62 6c 65 5f 6f 66  /tcl>..<table_of
0060: 5f 63 6f 6e 74 65 6e 74 73 3e 0a 0a 3c 68 31 3e  _contents>..<h1>
0070: 4f 76 65 72 76 69 65 77 3c 2f 68 31 3e 0a 0a 3c  Overview</h1>..<
0080: 70 3e 0a 54 68 65 20 53 51 4c 20 6c 61 6e 67 75  p>.The SQL langu
0090: 61 67 65 20 69 73 20 61 20 22 73 74 61 6e 64 61  age is a "standa
00a0: 72 64 22 2e 0a 45 76 65 6e 20 73 6f 2c 20 6e 6f  rd"..Even so, no
00b0: 20 74 77 6f 20 53 51 4c 20 64 61 74 61 62 61 73   two SQL databas
00c0: 65 20 65 6e 67 69 6e 65 73 20 77 6f 72 6b 20 65  e engines work e
00d0: 78 61 63 74 6c 79 20 61 6c 69 6b 65 2e 0a 45 76  xactly alike..Ev
00e0: 65 72 79 20 53 51 4c 20 69 6d 70 6c 65 6d 65 6e  ery SQL implemen
00f0: 74 61 74 69 6f 6e 20 68 61 73 20 69 74 20 6f 77  tation has it ow
0100: 6e 20 70 65 63 75 6c 69 61 72 69 74 69 65 73 20  n peculiarities 
0110: 61 6e 64 20 6f 64 64 69 74 69 65 73 2c 0a 61 6e  and oddities,.an
0120: 64 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 20 65  d SQLite is no e
0130: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
0140: 20 72 75 6c 65 2e 0a 0a 3c 70 3e 0a 54 68 69 73   rule...<p>.This
0150: 20 64 6f 63 75 6d 65 6e 74 20 73 74 72 69 76 65   document strive
0160: 73 20 74 6f 20 68 69 67 68 6c 69 67 68 74 20 74  s to highlight t
0170: 68 65 20 70 72 69 6e 63 69 70 61 6c 20 64 69 66  he principal dif
0180: 66 65 72 65 6e 63 65 73 0a 62 65 74 77 65 65 6e  ferences.between
0190: 20 53 51 4c 69 74 65 20 61 6e 64 20 6f 74 68 65   SQLite and othe
01a0: 72 20 53 51 4c 20 69 6d 70 6c 65 6d 65 6e 74 61  r SQL implementa
01b0: 74 69 6f 6e 73 2c 20 61 73 20 61 6e 20 61 69 64  tions, as an aid
01c0: 20 74 6f 20 64 65 76 65 6c 6f 70 65 72 73 0a 74   to developers.t
01d0: 68 61 74 20 61 72 65 20 70 6f 72 74 69 6e 67 20  hat are porting 
01e0: 74 6f 20 6f 72 20 66 72 6f 6d 20 53 51 4c 69 74  to or from SQLit
01f0: 65 20 6f 72 20 77 68 6f 20 61 72 65 20 74 72 79  e or who are try
0200: 69 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 0a 73  ing to build a.s
0210: 79 73 74 65 6d 20 74 68 61 74 20 77 6f 72 6b 73  ystem that works
0220: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
0230: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0240: 73 2e 0a 0a 3c 70 3e 0a 49 66 20 79 6f 75 20 61  s...<p>.If you a
0250: 72 65 20 61 6e 20 53 51 4c 69 74 65 20 75 73 65  re an SQLite use
0260: 72 20 77 68 6f 73 65 20 68 61 73 20 73 74 75 6d  r whose has stum
0270: 62 6c 65 64 20 6f 76 65 72 20 73 6f 6d 65 20 71  bled over some q
0280: 75 69 72 6b 20 6f 66 0a 53 51 4c 69 74 65 20 74  uirk of.SQLite t
0290: 68 61 74 20 69 73 20 6e 6f 74 20 6d 65 6e 74 69  hat is not menti
02a0: 6f 6e 65 64 20 68 65 72 65 2c 20 70 6c 65 61 73  oned here, pleas
02b0: 65 20 73 65 6e 64 20 75 73 20 61 6e 20 65 6d 61  e send us an ema
02c0: 69 6c 20 73 6f 20 74 68 61 74 0a 77 65 20 63 61  il so that.we ca
02d0: 6e 20 64 6f 63 75 6d 65 6e 74 20 74 68 65 20 70  n document the p
02e0: 72 6f 62 6c 65 6d 2e 0a 0a 3c 68 31 3e 53 51 4c  roblem...<h1>SQL
02f0: 69 74 65 20 49 73 20 45 6d 62 65 64 64 65 64 2c  ite Is Embedded,
0300: 20 4e 6f 74 20 43 6c 69 65 6e 74 2d 53 65 72 76   Not Client-Serv
0310: 65 72 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 57 68 65  er</h1>..<p>.Whe
0320: 6e 20 65 76 65 72 20 63 6f 6d 70 61 72 69 6e 67  n ever comparing
0330: 20 53 51 4c 69 74 65 20 74 6f 20 6f 74 68 65 72   SQLite to other
0340: 20 53 51 4c 20 64 61 74 61 62 61 73 65 20 65 6e   SQL database en
0350: 67 69 6e 65 73 20 6c 69 6b 65 0a 53 51 4c 20 53  gines like.SQL S
0360: 65 72 76 65 72 2c 20 50 6f 73 74 67 72 65 53 51  erver, PostgreSQ
0370: 4c 2c 20 4d 79 53 51 4c 2c 20 6f 72 20 4f 72 61  L, MySQL, or Ora
0380: 63 6c 65 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  cle, it is impor
0390: 74 61 6e 74 20 66 69 72 73 74 20 6f 66 20 61 6c  tant first of al
03a0: 6c 0a 74 6f 20 72 65 61 6c 69 7a 65 20 74 68 65  l.to realize the
03b0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 69   SQLite is not i
03c0: 6e 74 65 6e 64 65 64 20 61 73 20 61 20 72 65 70  ntended as a rep
03d0: 6c 61 63 65 6d 65 6e 74 20 6f 72 20 63 6f 6d 70  lacement or comp
03e0: 65 74 69 74 6f 72 20 74 6f 0a 61 6e 79 20 6f 66  etitor to.any of
03f0: 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73 2e 20   those systems. 
0400: 20 53 51 4c 69 74 65 20 69 73 20 5b 73 65 72 76   SQLite is [serv
0410: 65 72 6c 65 73 73 5d 2e 20 20 54 68 65 72 65 20  erless].  There 
0420: 69 73 20 6e 6f 20 73 65 70 61 72 61 74 65 0a 73  is no separate.s
0430: 65 72 76 65 72 20 70 72 6f 63 65 73 73 20 74 68  erver process th
0440: 61 74 20 6d 61 6e 61 67 65 73 20 74 68 65 20 64  at manages the d
0450: 61 74 61 62 61 73 65 2e 20 20 41 6e 20 61 70 70  atabase.  An app
0460: 6c 69 63 61 74 69 6f 6e 20 69 6e 74 65 72 61 63  lication interac
0470: 74 0a 77 69 74 68 20 74 68 65 20 64 61 74 61 62  t.with the datab
0480: 61 73 65 20 65 6e 67 69 6e 65 20 75 73 69 6e 67  ase engine using
0490: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2c   function calls,
04a0: 20 6e 6f 74 20 62 65 20 73 65 6e 64 69 6e 67 20   not be sending 
04b0: 6d 65 73 73 61 67 65 73 0a 74 6f 20 61 20 73 65  messages.to a se
04c0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 20 6f  parate process o
04d0: 72 20 74 68 72 65 61 64 2e 0a 0a 3c 70 3e 0a 54  r thread...<p>.T
04e0: 68 65 20 66 61 63 74 20 74 68 61 74 20 53 51 4c  he fact that SQL
04f0: 69 74 65 20 69 73 20 65 6d 62 65 64 64 65 64 20  ite is embedded 
0500: 61 6e 64 20 5b 73 65 72 76 65 72 6c 65 73 73 5d  and [serverless]
0510: 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e   instead of bein
0520: 67 0a 63 6c 69 65 6e 74 2f 73 65 72 76 65 72 20  g.client/server 
0530: 69 73 20 61 20 66 65 61 74 75 72 65 2c 20 6e 6f  is a feature, no
0540: 74 20 61 20 62 75 67 2e 0a 0a 3c 70 3e 0a 43 6c  t a bug...<p>.Cl
0550: 69 65 6e 74 2f 73 65 72 76 65 72 20 64 61 74 61  ient/server data
0560: 62 61 73 65 73 20 6c 69 6b 65 20 4d 79 53 51 4c  bases like MySQL
0570: 2c 20 50 6f 73 74 67 72 65 53 51 4c 2c 20 53 51  , PostgreSQL, SQ
0580: 4c 20 53 65 72 76 65 72 2c 20 4f 72 61 63 6c 65  L Server, Oracle
0590: 2c 20 61 6e 64 0a 6f 74 68 65 72 73 20 61 72 65  , and.others are
05a0: 20 61 6e 20 69 6d 70 6f 72 74 61 6e 74 20 63 6f   an important co
05b0: 6d 70 6f 6e 65 6e 74 20 6f 66 20 6d 6f 64 65 72  mponent of moder
05c0: 6e 20 73 79 73 74 65 6d 73 2e 20 20 0a 54 68 65  n systems.  .The
05d0: 73 65 20 73 79 73 74 65 6d 73 20 73 6f 6c 76 65  se systems solve
05e0: 20 61 6e 20 69 6d 70 6f 72 74 61 6e 74 20 70 72   an important pr
05f0: 6f 62 6c 65 6d 2e 20 20 0a 42 75 74 20 53 51 4c  oblem.  .But SQL
0600: 69 74 65 20 73 6f 6c 76 65 73 20 61 20 64 69 66  ite solves a dif
0610: 66 65 72 65 6e 74 20 70 72 6f 62 6c 65 6d 2e 0a  ferent problem..
0620: 42 6f 74 68 20 53 51 4c 69 74 65 20 61 6e 64 20  Both SQLite and 
0630: 63 6c 69 65 6e 74 2f 73 65 72 76 65 72 20 64 61  client/server da
0640: 74 61 62 61 73 65 73 20 68 61 76 65 20 74 68 65  tabases have the
0650: 69 72 20 72 6f 6c 65 2e 0a 44 65 76 65 6c 6f 70  ir role..Develop
0660: 65 72 73 20 77 68 6f 20 61 72 65 20 63 6f 6d 70  ers who are comp
0670: 61 72 69 6e 67 20 53 51 4c 69 74 65 20 61 67 61  aring SQLite aga
0680: 69 6e 73 74 20 6f 74 68 65 72 20 53 51 4c 20 64  inst other SQL d
0690: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 20  atabase engines 
06a0: 6e 65 65 64 0a 74 6f 20 63 6c 65 61 72 6c 79 20  need.to clearly 
06b0: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 69 73 20  understand this 
06c0: 64 69 73 74 69 6e 63 74 69 6f 6e 2e 0a 0a 3c 70  distinction...<p
06d0: 3e 0a 53 65 65 20 74 68 65 20 5b 41 70 70 72 6f  >.See the [Appro
06e0: 70 72 69 61 74 65 20 55 73 65 73 20 46 6f 72 20  priate Uses For 
06f0: 53 51 4c 69 74 65 5d 20 64 6f 63 75 6d 65 6e 74  SQLite] document
0700: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
0710: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 3c 68  information...<h
0720: 31 3e 46 6c 65 78 69 62 6c 65 20 54 79 70 69 6e  1>Flexible Typin
0730: 67 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 53 51 4c 69  g</h1>..<p>.SQLi
0740: 74 65 20 69 73 20 76 65 72 79 20 66 6c 65 78 69  te is very flexi
0750: 62 6c 65 20 77 69 74 68 20 72 65 67 61 72 64 20  ble with regard 
0760: 74 6f 20 64 61 74 61 74 79 70 65 73 2e 0a 0a 3c  to datatypes...<
0770: 70 3e 0a 53 6f 6d 65 20 63 6f 6d 6d 65 6e 74 61  p>.Some commenta
0780: 74 6f 72 73 20 73 61 79 20 74 68 61 74 20 53 51  tors say that SQ
0790: 4c 69 74 65 20 69 73 20 22 77 65 61 6b 6c 79 20  Lite is "weakly 
07a0: 74 79 70 65 64 22 20 61 6e 64 20 74 68 61 74 20  typed" and that 
07b0: 6f 74 68 65 72 0a 53 51 4c 20 64 61 74 61 62 61  other.SQL databa
07c0: 73 65 73 20 61 72 65 20 22 73 74 72 6f 6e 67 6c  ses are "strongl
07d0: 79 20 74 79 70 65 64 22 2e 20 20 57 65 20 63 6f  y typed".  We co
07e0: 6e 73 69 64 65 72 20 74 68 65 73 65 20 74 65 72  nsider these ter
07f0: 6d 73 20 74 6f 20 62 65 0a 69 6e 61 63 63 75 72  ms to be.inaccur
0800: 61 74 65 20 61 6e 64 20 70 75 72 67 61 74 69 76  ate and purgativ
0810: 65 2e 20 20 57 65 20 70 72 65 66 65 72 20 74 6f  e.  We prefer to
0820: 20 73 61 79 20 74 68 61 74 20 53 51 4c 69 74 65   say that SQLite
0830: 20 69 73 20 22 66 6c 65 78 69 62 6c 79 20 74 79   is "flexibly ty
0840: 70 65 64 22 0a 61 6e 64 20 74 68 61 74 20 6f 74  ped".and that ot
0850: 68 65 72 20 53 51 4c 20 64 61 74 61 62 61 73 65  her SQL database
0860: 73 20 61 72 65 20 22 72 69 67 69 64 6c 79 20 74  s are "rigidly t
0870: 79 70 65 64 22 2e 0a 0a 3c 70 3e 0a 53 65 65 20  yped"...<p>.See 
0880: 74 68 65 20 5b 64 61 74 61 74 79 70 65 7c 44 61  the [datatype|Da
0890: 74 61 74 79 70 65 73 20 69 6e 20 53 51 4c 69 74  tatypes in SQLit
08a0: 65 20 56 65 72 73 69 6f 6e 20 33 5d 20 64 6f 63  e Version 3] doc
08b0: 75 6d 65 6e 74 20 66 6f 72 20 61 20 64 65 74 61  ument for a deta
08c0: 69 6c 65 64 0a 64 69 73 63 75 73 73 69 6f 6e 20  iled.discussion 
08d0: 6f 66 20 74 68 65 20 74 79 70 65 20 73 79 73 74  of the type syst
08e0: 65 6d 20 69 6e 20 53 51 4c 69 74 65 2e 0a 0a 3c  em in SQLite...<
08f0: 70 3e 0a 54 68 65 20 6b 65 79 20 70 6f 69 6e 74  p>.The key point
0900: 20 69 73 20 74 68 61 74 20 53 51 4c 69 74 65 20   is that SQLite 
0910: 69 73 20 76 65 72 79 20 66 6f 72 67 69 76 69 6e  is very forgivin
0920: 67 20 6f 66 20 74 68 65 20 74 79 70 65 20 6f 66  g of the type of
0930: 20 64 61 74 61 20 74 68 61 74 0a 79 6f 75 20 70   data that.you p
0940: 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
0950: 62 61 73 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  base.  For examp
0960: 6c 65 2c 20 69 66 20 61 20 63 6f 6c 75 6d 6e 20  le, if a column 
0970: 68 61 73 20 61 20 64 61 74 61 74 79 70 65 20 6f  has a datatype o
0980: 66 0a 22 49 4e 54 45 47 45 52 22 20 61 6e 64 20  f."INTEGER" and 
0990: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
09a0: 69 6e 73 65 72 74 73 20 61 20 74 65 78 74 20 73  inserts a text s
09b0: 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 61 74 20  tring into that 
09c0: 63 6f 6c 75 6d 6e 2c 0a 53 51 4c 69 74 65 20 77  column,.SQLite w
09d0: 69 6c 6c 20 66 69 72 73 74 20 74 72 79 20 74 6f  ill first try to
09e0: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 74 65 78   convert the tex
09f0: 74 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 6e  t string into an
0a00: 20 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20 6c   integer, just l
0a10: 69 6b 65 0a 65 76 65 72 79 20 6f 74 68 65 72 20  ike.every other 
0a20: 53 51 4c 20 64 61 74 61 62 61 73 65 20 65 6e 67  SQL database eng
0a30: 69 6e 65 2e 20 20 54 68 75 73 2c 20 69 66 20 6f  ine.  Thus, if o
0a40: 6e 65 20 69 6e 73 65 72 74 73 20 3c 62 3e 27 31  ne inserts <b>'1
0a50: 32 33 34 27 3c 2f 62 3e 20 69 6e 74 6f 0a 61 6e  234'</b> into.an
0a60: 20 49 4e 54 45 47 45 52 20 63 6f 6c 75 6d 6e 2c   INTEGER column,
0a70: 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 20 63   that value is c
0a80: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
0a90: 20 69 6e 74 65 67 65 72 20 31 32 33 34 20 61 6e   integer 1234 an
0aa0: 64 20 73 74 6f 72 65 64 2e 0a 42 75 74 2c 20 69  d stored..But, i
0ab0: 66 20 79 6f 75 20 69 6e 73 65 72 74 20 61 20 6e  f you insert a n
0ac0: 6f 6e 2d 6e 75 6d 65 72 69 63 20 73 74 72 69 6e  on-numeric strin
0ad0: 67 20 6c 69 6b 65 20 3c 62 3e 27 77 78 79 7a 27  g like <b>'wxyz'
0ae0: 3c 2f 62 3e 20 69 6e 74 6f 20 61 6e 20 49 4e 54  </b> into an INT
0af0: 45 47 45 52 0a 63 6f 6c 75 6d 6e 2c 20 75 6e 6c  EGER.column, unl
0b00: 69 6b 65 20 6f 74 68 65 72 20 53 51 4c 20 64 61  ike other SQL da
0b10: 74 61 62 61 73 65 73 2c 20 53 51 4c 69 74 65 20  tabases, SQLite 
0b20: 64 6f 65 73 20 6e 6f 74 20 74 68 72 6f 77 20 61  does not throw a
0b30: 6e 20 65 72 72 6f 72 2e 20 20 49 6e 73 74 65 61  n error.  Instea
0b40: 64 2c 0a 53 51 4c 69 74 65 20 73 74 6f 72 65 73  d,.SQLite stores
0b50: 20 74 68 65 20 61 63 74 75 61 6c 20 73 74 72 69   the actual stri
0b60: 6e 67 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ng value in the 
0b70: 63 6f 6c 75 6d 6e 2e 0a 0a 3c 70 3e 0a 53 69 6d  column...<p>.Sim
0b80: 69 6c 61 72 6c 79 2c 20 53 51 4c 69 74 65 20 61  ilarly, SQLite a
0b90: 6c 6c 6f 77 73 20 79 6f 75 20 74 6f 20 73 74 6f  llows you to sto
0ba0: 72 65 20 61 20 32 30 30 30 2d 63 68 61 72 61 63  re a 2000-charac
0bb0: 74 65 72 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ter string into 
0bc0: 61 0a 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65  a.column of type
0bd0: 20 56 41 52 43 48 41 52 28 35 30 29 2e 20 20 4f   VARCHAR(50).  O
0be0: 74 68 65 72 20 53 51 4c 20 69 6d 70 6c 65 6d 65  ther SQL impleme
0bf0: 6e 74 69 6f 6e 73 20 77 6f 75 6c 64 20 65 69 74  ntions would eit
0c00: 68 65 72 20 74 68 72 6f 77 0a 61 6e 20 65 72 72  her throw.an err
0c10: 6f 72 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  or or truncate t
0c20: 68 65 20 73 74 72 69 6e 67 2e 20 20 53 51 4c 69  he string.  SQLi
0c30: 74 65 20 73 74 6f 72 65 73 20 74 68 65 20 65 6e  te stores the en
0c40: 74 69 72 65 20 32 30 30 30 2d 63 68 61 72 61 63  tire 2000-charac
0c50: 74 65 72 0a 73 74 72 69 6e 67 20 77 69 74 68 20  ter.string with 
0c60: 6e 6f 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72  no loss of infor
0c70: 6d 61 74 69 6f 6e 20 61 6e 64 20 77 69 74 68 6f  mation and witho
0c80: 75 74 20 63 6f 6d 70 6c 61 69 6e 74 2e 0a 0a 3c  ut complaint...<
0c90: 70 3e 0a 57 68 65 72 65 20 74 68 69 73 20 65 6e  p>.Where this en
0ca0: 64 73 20 75 70 20 63 61 75 73 69 6e 67 20 70 72  ds up causing pr
0cb0: 6f 62 6c 65 6d 73 20 69 73 20 77 68 65 6e 20 64  oblems is when d
0cc0: 65 76 65 6c 6f 70 65 72 73 20 64 6f 20 73 6f 6d  evelopers do som
0cd0: 65 20 69 6e 69 74 69 61 6c 0a 63 6f 64 69 6e 67  e initial.coding
0ce0: 20 77 6f 72 6b 20 75 73 69 6e 67 20 53 51 4c 69   work using SQLi
0cf0: 74 65 20 61 6e 64 20 67 65 74 20 74 68 65 69 72  te and get their
0d00: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 77 6f 72   application wor
0d10: 6b 69 6e 67 2c 20 62 75 74 20 74 68 65 6e 20 74  king, but then t
0d20: 72 79 0a 74 6f 20 63 6f 6e 76 65 72 74 20 74 6f  ry.to convert to
0d30: 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
0d40: 65 20 6c 69 6b 65 20 50 6f 73 74 67 72 65 53 51  e like PostgreSQ
0d50: 4c 20 6f 72 20 53 51 4c 20 53 65 72 76 65 72 20  L or SQL Server 
0d60: 66 6f 72 20 64 65 70 6c 6f 79 6d 65 6e 74 2e 0a  for deployment..
0d70: 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  If the applicati
0d80: 6f 6e 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  on is initially 
0d90: 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
0da0: 20 6f 66 20 53 51 4c 69 74 65 27 73 20 66 6c 65   of SQLite's fle
0db0: 78 69 62 6c 65 20 74 79 70 69 6e 67 2c 0a 74 68  xible typing,.th
0dc0: 65 6e 20 69 74 20 77 69 6c 6c 20 66 61 69 6c 20  en it will fail 
0dd0: 77 68 65 6e 20 6d 6f 76 65 64 20 74 6f 20 61 6e  when moved to an
0de0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 74  other database t
0df0: 68 61 74 20 75 73 65 73 20 61 20 6d 6f 72 65 20  hat uses a more 
0e00: 72 69 67 69 64 0a 61 6e 64 20 75 6e 66 6f 72 67  rigid.and unforg
0e10: 69 76 69 6e 67 20 74 79 70 65 20 65 6e 66 6f 72  iving type enfor
0e20: 63 65 6d 65 6e 74 20 70 6f 6c 69 63 79 2e 0a 0a  cement policy...
0e30: 3c 70 3e 0a 46 6c 65 78 69 62 6c 65 20 74 79 70  <p>.Flexible typ
0e40: 69 6e 67 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ing is considere
0e50: 64 20 61 20 66 65 61 74 75 72 65 20 6f 66 20 53  d a feature of S
0e60: 51 4c 69 74 65 2c 20 6e 6f 74 20 61 20 62 75 67  QLite, not a bug
0e70: 2e 0a 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  ..Nevertheless, 
0e80: 77 65 20 72 65 63 6f 67 6e 69 7a 65 20 74 68 61  we recognize tha
0e90: 74 20 74 68 69 73 20 66 65 61 74 75 72 65 20 64  t this feature d
0ea0: 6f 65 73 20 73 6f 6d 65 74 69 6d 65 73 20 63 61  oes sometimes ca
0eb0: 75 73 65 0a 63 6f 6e 66 75 73 69 6f 6e 20 61 6e  use.confusion an
0ec0: 64 20 70 61 69 6e 20 66 6f 72 20 64 65 76 65 6c  d pain for devel
0ed0: 6f 70 65 72 73 20 77 68 6f 20 61 72 65 20 61 63  opers who are ac
0ee0: 75 73 74 6f 6d 65 64 20 74 6f 20 77 6f 72 6b 69  ustomed to worki
0ef0: 6e 67 20 77 69 74 68 0a 6f 74 68 65 72 20 64 61  ng with.other da
0f00: 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65  tabases that are
0f10: 20 6d 6f 72 65 20 6a 75 64 67 65 6d 65 6e 74 61   more judgementa
0f20: 6c 20 77 69 74 68 20 72 65 67 61 72 64 20 74 6f  l with regard to
0f30: 20 64 61 74 61 20 74 79 70 65 73 2e 0a 49 6e 20   data types..In 
0f40: 72 65 74 72 6f 73 70 65 63 74 2c 20 70 65 72 68  retrospect, perh
0f50: 61 70 73 20 69 74 20 77 6f 75 6c 64 20 68 61 76  aps it would hav
0f60: 65 20 62 65 65 6e 20 62 65 74 74 65 72 20 69 66  e been better if
0f70: 20 53 51 4c 69 74 65 20 68 61 64 20 6d 65 72 65   SQLite had mere
0f80: 6c 79 0a 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ly.implemented a
0f90: 6e 20 41 4e 59 20 64 61 74 61 74 79 70 65 20 73  n ANY datatype s
0fa0: 6f 20 74 68 61 74 20 64 65 76 65 6c 6f 70 65 72  o that developer
0fb0: 73 20 63 6f 75 6c 64 20 65 78 70 6c 69 63 69 74  s could explicit
0fc0: 6c 79 20 73 74 61 74 65 0a 77 68 65 6e 20 74 68  ly state.when th
0fd0: 65 79 20 77 61 6e 74 65 64 20 74 6f 20 75 73 65  ey wanted to use
0fe0: 20 66 6c 65 78 69 62 6c 65 20 74 79 70 69 6e 67   flexible typing
0ff0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 6d 61  , rather than ma
1000: 6b 69 6e 67 20 66 6c 65 78 69 62 6c 65 0a 74 79  king flexible.ty
1010: 70 69 6e 67 20 74 68 65 20 64 65 66 61 75 6c 74  ping the default
1020: 2e 0a 42 75 74 20 74 68 61 74 20 69 73 20 6e 6f  ..But that is no
1030: 74 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  t something that
1040: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20   can be changed 
1050: 6e 6f 77 20 77 69 74 68 6f 75 74 20 62 72 65 61  now without brea
1060: 6b 69 6e 67 0a 74 68 65 20 6d 69 6c 6c 69 6f 6e  king.the million
1070: 73 20 6f 66 20 61 70 70 6c 69 63 61 74 69 6f 6e  s of application
1080: 73 20 61 6e 64 20 74 72 69 6c 6c 69 6f 6e 73 20  s and trillions 
1090: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
10a0: 73 20 74 68 61 74 20 0a 61 6c 72 65 61 64 79 20  s that .already 
10b0: 75 73 65 20 53 51 4c 69 74 65 27 73 20 66 6c 65  use SQLite's fle
10c0: 78 69 62 6c 65 20 74 79 70 69 6e 67 20 66 65 61  xible typing fea
10d0: 74 75 72 65 2e 0a 0a 3c 68 32 3e 4e 6f 20 53 65  ture...<h2>No Se
10e0: 70 61 72 61 74 65 20 42 4f 4f 4c 45 41 4e 20 44  parate BOOLEAN D
10f0: 61 74 61 74 79 70 65 3c 2f 68 32 3e 0a 0a 3c 70  atatype</h2>..<p
1100: 3e 0a 55 6e 6c 69 6b 65 20 6d 6f 73 74 20 6f 74  >.Unlike most ot
1110: 68 65 72 20 53 51 4c 20 69 6d 70 6c 65 6d 65 6e  her SQL implemen
1120: 74 61 74 69 6f 6e 73 2c 0a 53 51 4c 69 74 65 20  tations,.SQLite 
1130: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
1140: 73 65 70 61 72 61 74 65 20 42 4f 4f 4c 45 41 4e  separate BOOLEAN
1150: 20 64 61 74 61 20 74 79 70 65 2e 0a 49 6e 73 74   data type..Inst
1160: 65 61 64 2c 20 54 52 55 45 20 61 6e 64 20 46 41  ead, TRUE and FA
1170: 4c 53 45 20 61 72 65 20 28 6e 6f 72 6d 61 6c 6c  LSE are (normall
1180: 79 29 20 72 65 70 72 65 73 65 6e 74 65 64 20 61  y) represented a
1190: 73 20 69 6e 74 65 67 65 72 73 20 31 20 61 6e 64  s integers 1 and
11a0: 20 30 2c 0a 72 65 73 70 65 63 74 69 76 65 6c 79   0,.respectively
11b0: 2e 0a 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  ..This does not 
11c0: 73 65 65 6d 20 74 6f 20 63 61 75 73 65 20 6d 61  seem to cause ma
11d0: 6e 79 20 70 72 6f 62 6c 65 6d 73 2c 20 61 73 20  ny problems, as 
11e0: 77 65 20 73 65 6c 64 6f 6d 20 67 65 74 20 63 6f  we seldom get co
11f0: 6d 70 6c 61 69 6e 74 73 0a 61 62 6f 75 74 20 69  mplaints.about i
1200: 74 2e 20 20 42 75 74 20 69 74 20 69 73 20 69 6d  t.  But it is im
1210: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 63 6f 67  portant to recog
1220: 6e 69 7a 65 2e 0a 0a 3c 70 3e 0a 42 65 67 69 6e  nize...<p>.Begin
1230: 6e 69 6e 67 20 77 69 74 68 20 53 51 4c 69 74 65  ning with SQLite
1240: 20 5b 76 65 72 73 69 6f 6e 20 33 2e 32 33 2e 30   [version 3.23.0
1250: 5d 20 28 5b 64 61 74 65 6f 66 3a 33 2e 32 33 2e  ] ([dateof:3.23.
1260: 30 5d 29 2c 20 53 51 4c 69 74 65 20 61 6c 73 6f  0]), SQLite also
1270: 0a 72 65 63 6f 67 6e 69 7a 65 73 20 54 52 55 45  .recognizes TRUE
1280: 20 61 6e 64 20 46 41 4c 53 45 20 6b 65 79 77 6f   and FALSE keywo
1290: 72 64 73 20 61 73 20 61 6c 69 61 73 65 73 20 66  rds as aliases f
12a0: 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  or integer value
12b0: 73 20 31 20 61 6e 64 20 30 2c 0a 72 65 73 70 65  s 1 and 0,.respe
12c0: 63 74 69 76 65 6c 79 2e 0a 54 68 69 73 20 70 72  ctively..This pr
12d0: 6f 76 69 64 65 73 20 62 65 74 74 65 72 20 63 6f  ovides better co
12e0: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
12f0: 20 6f 74 68 65 72 20 53 51 4c 20 69 6d 70 6c 65   other SQL imple
1300: 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 42 75 74 20  mentations..But 
1310: 74 6f 20 72 65 74 61 69 6e 20 62 61 63 6b 77 61  to retain backwa
1320: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
1330: 79 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  y, if there are 
1340: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 54 52  columns named TR
1350: 55 45 20 6f 72 0a 46 41 4c 53 45 2c 20 74 68 65  UE or.FALSE, the
1360: 6e 20 74 68 65 20 6b 65 79 77 6f 72 64 73 20 61  n the keywords a
1370: 72 65 20 74 72 65 61 74 65 64 20 61 73 20 69 64  re treated as id
1380: 65 6e 74 69 66 69 65 72 73 20 72 65 66 65 72 65  entifiers refere
1390: 6e 63 69 6e 67 20 74 68 6f 73 65 0a 63 6f 6c 75  ncing those.colu
13a0: 6d 6e 73 2c 20 72 61 74 68 65 72 20 74 68 61 6e  mns, rather than
13b0: 20 42 4f 4f 4c 45 41 4e 20 6c 69 74 65 72 61 6c   BOOLEAN literal
13c0: 73 2e 0a 0a 3c 68 32 3e 4e 6f 20 53 65 70 61 72  s...<h2>No Separ
13d0: 61 74 65 20 44 41 54 45 54 49 4d 45 20 44 61 74  ate DATETIME Dat
13e0: 61 74 79 70 65 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  atype</h2>..<p>.
13f0: 53 51 4c 69 74 65 20 61 73 20 6e 6f 20 44 41 54  SQLite as no DAT
1400: 45 54 49 4d 45 20 64 61 74 61 74 79 70 65 2e 0a  ETIME datatype..
1410: 49 6e 73 74 65 61 64 2c 20 64 61 74 65 73 20 61  Instead, dates a
1420: 6e 64 20 74 69 6d 65 73 20 63 61 6e 20 62 65 20  nd times can be 
1430: 73 74 6f 72 65 64 20 69 6e 20 61 6e 79 20 6f 66  stored in any of
1440: 20 74 68 65 73 65 20 77 61 79 73 3a 0a 0a 3c 75   these ways:..<u
1450: 6c 3e 0a 3c 6c 69 3e 20 41 73 20 61 20 54 45 58  l>.<li> As a TEX
1460: 54 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  T string in the 
1470: 49 53 4f 2d 38 36 31 30 20 66 6f 72 6d 61 74 2e  ISO-8610 format.
1480: 20 20 45 78 61 6d 70 6c 65 3a 20 27 32 30 31 38    Example: '2018
1490: 2d 30 34 2d 30 32 20 31 32 3a 31 33 3a 34 36 27  -04-02 12:13:46'
14a0: 2e 0a 3c 6c 69 3e 20 41 73 20 61 6e 20 49 4e 54  ..<li> As an INT
14b0: 45 47 45 52 20 6e 75 6d 62 65 72 20 6f 66 20 73  EGER number of s
14c0: 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
14d0: 30 20 28 61 6c 73 6f 20 6b 6e 6f 77 6e 20 61 73  0 (also known as
14e0: 20 22 75 6e 69 78 20 74 69 6d 65 22 29 2e 0a 3c   "unix time")..<
14f0: 6c 69 3e 20 41 73 20 61 20 52 45 41 4c 20 76 61  li> As a REAL va
1500: 6c 75 65 20 74 68 61 74 20 69 73 20 74 68 65 20  lue that is the 
1510: 66 72 61 63 74 69 6f 6e 61 6c 20 0a 20 20 20 20  fractional .    
1520: 20 5b 68 74 74 70 73 3a 2f 2f 65 6e 2e 77 69 6b   [https://en.wik
1530: 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f  ipedia.org/wiki/
1540: 4a 75 6c 69 61 6e 5f 64 61 79 7c 4a 75 6c 69 61  Julian_day|Julia
1550: 6e 20 64 61 79 20 6e 75 6d 62 65 72 5d 2e 0a 3c  n day number]..<
1560: 2f 75 6c 3e 0a 0a 3c 70 3e 0a 54 68 65 20 62 75  /ul>..<p>.The bu
1570: 69 6c 74 2d 69 6e 20 5b 64 61 74 65 20 61 6e 64  ilt-in [date and
1580: 20 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 5d   time functions]
1590: 20 6f 66 20 53 51 4c 69 74 65 20 75 6e 64 65 72   of SQLite under
15a0: 73 74 61 6e 64 20 64 61 74 65 2f 74 69 6d 65 73  stand date/times
15b0: 20 69 6e 0a 61 6c 6c 20 6f 66 20 74 68 65 20 66   in.all of the f
15c0: 6f 72 6d 61 74 73 20 61 62 6f 76 65 2c 20 61 6e  ormats above, an
15d0: 64 20 63 61 6e 20 66 72 65 65 6c 79 20 63 68 61  d can freely cha
15e0: 6e 67 65 20 62 65 74 77 65 65 6e 20 74 68 65 6d  nge between them
15f0: 2e 0a 57 68 69 63 68 20 66 6f 72 6d 61 74 20 79  ..Which format y
1600: 6f 75 20 75 73 65 2c 20 69 73 20 65 6e 74 69 72  ou use, is entir
1610: 65 6c 79 20 75 70 20 74 6f 20 79 6f 75 72 20 61  ely up to your a
1620: 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 0a 3c 68 31  pplication...<h1
1630: 3e 46 6f 72 65 69 67 6e 20 4b 65 79 20 45 6e 66  >Foreign Key Enf
1640: 6f 72 63 65 6d 65 6e 74 20 49 73 20 4f 66 66 20  orcement Is Off 
1650: 42 79 20 44 65 66 61 75 6c 74 3c 2f 68 31 3e 0a  By Default</h1>.
1660: 0a 3c 70 3e 53 51 4c 69 74 65 20 68 61 73 20 70  .<p>SQLite has p
1670: 61 72 73 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  arsed foreign ke
1680: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  y constraints fo
1690: 72 20 74 69 6d 65 20 6f 75 74 20 6f 66 20 6d 69  r time out of mi
16a0: 6e 64 2c 0a 62 75 74 20 61 64 64 65 64 20 74 68  nd,.but added th
16b0: 65 20 61 62 69 6c 69 74 79 20 74 6f 20 61 63 74  e ability to act
16c0: 75 61 6c 6c 79 20 65 6e 66 6f 72 63 65 20 74 68  ually enforce th
16d0: 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ose constraints 
16e0: 6d 75 63 68 20 6c 61 74 65 72 2c 0a 77 69 74 68  much later,.with
16f0: 20 5b 76 65 72 73 69 6f 6e 20 33 2e 36 2e 31 39   [version 3.6.19
1700: 5d 20 28 5b 64 61 74 65 6f 66 3a 33 2e 36 2e 31  ] ([dateof:3.6.1
1710: 39 5d 29 2e 20 20 42 79 20 74 68 65 20 74 69 6d  9]).  By the tim
1720: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
1730: 6e 73 74 72 61 69 6e 74 0a 65 6e 66 6f 72 63 65  nstraint.enforce
1740: 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 2c 20  ment was added, 
1750: 74 68 65 72 65 20 77 68 65 72 65 20 61 6c 72 65  there where alre
1760: 61 64 79 20 63 6f 75 6e 74 6c 65 73 73 20 6d 69  ady countless mi
1770: 6c 6c 69 6f 6e 73 20 6f 66 20 64 61 74 61 62 61  llions of databa
1780: 73 65 73 0a 69 6e 20 63 69 72 63 75 6c 61 74 69  ses.in circulati
1790: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65  on that containe
17a0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
17b0: 6e 73 74 72 61 69 6e 74 73 2c 20 73 6f 6d 65 20  nstraints, some 
17c0: 6f 66 20 77 68 69 63 68 0a 77 65 72 65 20 6e 6f  of which.were no
17d0: 74 20 63 6f 72 72 65 63 74 2e 20 20 54 6f 20 61  t correct.  To a
17e0: 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 74 68  void breaking th
17f0: 6f 73 65 20 6c 65 67 61 63 79 20 64 61 74 61 62  ose legacy datab
1800: 61 73 65 73 2c 20 66 6f 72 65 69 67 6e 20 6b 65  ases, foreign ke
1810: 79 0a 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66  y.constraint enf
1820: 6f 72 63 65 6d 65 6e 74 20 69 73 20 74 75 72 6e  orcement is turn
1830: 65 64 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c  ed off by defaul
1840: 74 20 69 6e 20 53 51 4c 69 74 65 2e 0a 0a 3c 70  t in SQLite...<p
1850: 3e 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 63 61  >Applications ca
1860: 6e 20 61 63 74 69 76 61 74 65 20 66 6f 72 65 69  n activate forei
1870: 67 6e 20 6b 65 79 20 65 6e 66 6f 72 63 65 6d 65  gn key enforceme
1880: 6e 74 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 75  nt at run-time u
1890: 73 69 6e 67 0a 74 68 65 20 5b 50 52 41 47 4d 41  sing.the [PRAGMA
18a0: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 5d 20 73   foreign_keys] s
18b0: 74 61 74 65 6d 65 6e 74 2e 20 20 4f 72 2c 20 66  tatement.  Or, f
18c0: 6f 72 65 69 67 6e 20 6b 65 79 20 65 6e 66 6f 72  oreign key enfor
18d0: 63 65 6d 65 6e 74 20 63 61 6e 0a 62 65 20 61 63  cement can.be ac
18e0: 74 69 76 61 74 65 64 20 61 74 20 63 6f 6d 70 69  tivated at compi
18f0: 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68  le-time using th
1900: 65 0a 5b 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  e.[-DSQLITE_DEFA
1910: 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
1920: 3d 31 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  =1] compile-time
1930: 20 6f 70 74 69 6f 6e 2e 0a 0a 3c 68 31 3e 50 52   option...<h1>PR
1940: 49 4d 41 52 59 20 4b 45 59 73 20 43 61 6e 20 53  IMARY KEYs Can S
1950: 6f 6d 65 74 69 6d 65 73 20 43 6f 6e 74 61 69 6e  ometimes Contain
1960: 20 4e 55 4c 4c 73 3c 2f 68 31 3e 0a 0a 3c 70 3e   NULLs</h1>..<p>
1970: 0a 55 73 75 61 6c 6c 79 20 28 74 68 65 20 65 78  .Usually (the ex
1980: 63 65 70 74 69 6f 6e 73 20 61 72 65 20 5b 49 4e  ceptions are [IN
1990: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
19a0: 59 5d 20 74 61 62 6c 65 73 20 61 6e 64 0a 5b 57  Y] tables and.[W
19b0: 49 54 48 4f 55 54 20 52 4f 57 49 44 5d 20 74 61  ITHOUT ROWID] ta
19c0: 62 6c 65 73 29 20 61 20 50 52 49 4d 41 52 59 20  bles) a PRIMARY 
19d0: 4b 45 59 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  KEY in an SQLite
19e0: 20 74 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79   table is really
19f0: 0a 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 55  .the same as a U
1a00: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1a10: 2e 20 20 44 75 65 20 74 6f 20 61 6e 20 68 69 73  .  Due to an his
1a20: 74 6f 72 69 63 61 6c 20 6f 76 65 72 73 69 67 68  torical oversigh
1a30: 74 2c 0a 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  t,.the column va
1a40: 6c 75 65 73 20 6f 66 20 73 75 63 68 20 61 20 50  lues of such a P
1a50: 52 49 4d 41 52 59 20 4b 45 59 20 61 72 65 20 61  RIMARY KEY are a
1a60: 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 4e 55 4c  llowed to be NUL
1a70: 4c 2e 0a 54 68 69 73 20 69 73 20 61 20 62 75 67  L..This is a bug
1a80: 2c 20 62 75 74 20 62 79 20 74 68 65 20 74 69 6d  , but by the tim
1a90: 65 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 77 61  e the problem wa
1aa0: 73 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 65  s discovered the
1ab0: 72 65 0a 77 68 65 72 65 20 73 6f 20 6d 61 6e 79  re.where so many
1ac0: 20 64 61 74 61 62 61 73 65 73 20 69 6e 20 63 69   databases in ci
1ad0: 72 63 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 64  rculation that d
1ae0: 65 70 65 6e 64 65 64 20 6f 6e 20 74 68 65 20 62  epended on the b
1af0: 75 67 20 74 68 61 74 0a 74 68 65 20 64 65 63 69  ug that.the deci
1b00: 73 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 74 6f  sion was made to
1b10: 20 73 75 70 70 6f 72 74 20 74 68 65 20 62 75 67   support the bug
1b20: 67 69 6e 67 20 62 65 68 61 76 69 6f 72 20 6d 6f  ging behavior mo
1b30: 76 69 6e 67 20 66 6f 72 77 61 72 64 2e 0a 3c 70  ving forward..<p
1b40: 3e 0a 54 68 65 20 76 61 6c 75 65 20 6f 66 20 61  >.The value of a
1b50: 6e 20 5b 49 4e 54 45 47 45 52 20 50 52 49 4d 41  n [INTEGER PRIMA
1b60: 52 59 20 4b 45 59 5d 20 63 6f 6c 75 6d 6e 20 6d  RY KEY] column m
1b70: 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 61 20  ust always be a 
1b80: 0a 6e 6f 6e 2d 4e 55 4c 4c 20 69 6e 74 65 67 65  .non-NULL intege
1b90: 72 2e 20 20 54 68 65 20 50 52 49 4d 41 52 59 20  r.  The PRIMARY 
1ba0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61  KEY columns of a
1bb0: 20 5b 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5d   [WITHOUT ROWID]
1bc0: 0a 74 61 62 6c 65 20 61 72 65 20 61 6c 73 6f 20  .table are also 
1bd0: 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6e  required to be n
1be0: 6f 6e 2d 4e 55 4c 4c 2e 0a 0a 3c 68 31 3e 41 67  on-NULL...<h1>Ag
1bf0: 67 72 65 67 61 74 65 20 51 75 65 72 69 65 73 20  gregate Queries 
1c00: 43 61 6e 20 43 6f 6e 74 61 69 6e 20 4e 6f 6e 2d  Can Contain Non-
1c10: 41 67 67 72 65 67 61 74 65 20 52 65 73 75 6c 74  Aggregate Result
1c20: 20 43 6f 6c 75 6d 6e 73 0a 54 68 61 74 20 41 72   Columns.That Ar
1c30: 65 20 4e 6f 74 20 49 6e 20 54 68 65 20 47 52 4f  e Not In The GRO
1c40: 55 50 20 42 59 20 43 6c 61 75 73 65 3c 2f 68 31  UP BY Clause</h1
1c50: 3e 0a 0a 3c 70 3e 0a 49 6e 20 6d 6f 73 74 20 53  >..<p>.In most S
1c60: 51 4c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  QL implementatio
1c70: 6e 73 2c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ns, output colum
1c80: 6e 73 20 6f 66 20 61 6e 20 61 67 67 72 65 67 61  ns of an aggrega
1c90: 74 65 20 71 75 65 72 79 0a 6d 61 79 20 6f 6e 6c  te query.may onl
1ca0: 79 20 72 65 66 65 72 65 6e 63 65 20 61 67 67 72  y reference aggr
1cb0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1cc0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64  or columns named
1cd0: 20 69 6e 20 74 68 65 0a 47 52 4f 55 50 20 42 59   in the.GROUP BY
1ce0: 20 63 6c 61 75 73 65 2e 20 20 49 74 20 64 6f 65   clause.  It doe
1cf0: 73 20 6e 6f 74 20 6d 61 6b 65 20 67 6f 6f 64 20  s not make good 
1d00: 73 65 6e 73 65 20 74 6f 20 72 65 66 65 72 65 6e  sense to referen
1d10: 63 65 20 61 6e 20 6f 72 64 69 6e 61 72 79 0a 63  ce an ordinary.c
1d20: 6f 6c 75 6d 6e 20 69 6e 20 61 6e 20 61 67 67 72  olumn in an aggr
1d30: 65 67 61 74 65 20 71 75 65 72 79 20 62 65 63 61  egate query beca
1d40: 75 73 65 20 65 61 63 68 20 6f 75 74 70 75 74 20  use each output 
1d50: 72 6f 77 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  row might be com
1d60: 70 6f 73 65 64 0a 66 72 6f 6d 20 74 77 6f 20 6d  posed.from two m
1d70: 6f 72 65 20 6d 6f 72 65 20 72 6f 77 73 20 69 6e  ore more rows in
1d80: 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
1d90: 28 73 29 2e 0a 0a 3c 70 3e 0a 53 51 4c 69 74 65  (s)...<p>.SQLite
1da0: 20 64 6f 65 73 20 6e 6f 74 20 69 6d 70 6f 73 65   does not impose
1db0: 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
1dc0: 6e 2e 0a 54 68 65 20 6f 75 74 70 75 74 20 63 6f  n..The output co
1dd0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 20 61 67  lumns from an ag
1de0: 67 72 65 67 61 74 65 20 71 75 65 72 79 20 63 61  gregate query ca
1df0: 6e 20 62 65 20 61 72 62 69 74 72 61 72 79 20 65  n be arbitrary e
1e00: 78 70 72 65 73 73 69 6f 6e 73 0a 74 68 61 74 20  xpressions.that 
1e10: 69 6e 63 6c 75 64 65 20 63 6f 6c 75 6d 6e 73 20  include columns 
1e20: 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 47 52 4f  not found in GRO
1e30: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 54 68  UP BY clause..Th
1e40: 69 73 20 66 65 61 74 75 72 65 20 68 61 73 20 74  is feature has t
1e50: 77 6f 20 75 73 65 73 3a 0a 0a 3c 6f 6c 3e 0a 3c  wo uses:..<ol>.<
1e60: 6c 69 3e 3c 70 3e 0a 57 69 74 68 20 53 51 4c 69  li><p>.With SQLi
1e70: 74 65 20 28 62 75 74 20 6e 6f 74 20 61 6e 79 20  te (but not any 
1e80: 6f 74 68 65 72 20 53 51 4c 20 69 6d 70 6c 65 6d  other SQL implem
1e90: 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 77 65  entation that we
1ea0: 20 6b 6e 6f 77 20 6f 66 29 20 69 66 0a 61 6e 20   know of) if.an 
1eb0: 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
1ec0: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
1ed0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
1ee0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
1ef0: 74 68 65 0a 76 61 6c 75 65 73 20 6f 66 20 63 6f  the.values of co
1f00: 6c 75 6d 6e 73 20 75 73 65 64 20 69 6e 20 74 68  lumns used in th
1f10: 65 20 6f 75 74 70 75 74 20 61 72 65 20 74 61 6b  e output are tak
1f20: 65 6e 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20  en from the row 
1f30: 77 68 65 72 65 0a 74 68 65 20 6d 69 6e 28 29 20  where.the min() 
1f40: 6f 72 20 6d 61 78 28 29 20 76 61 6c 75 65 20 77  or max() value w
1f50: 61 73 20 61 63 68 69 65 76 65 64 2e 20 20 49 66  as achieved.  If
1f60: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 6f 77   two or more row
1f70: 73 20 68 61 76 65 20 74 68 65 0a 73 61 6d 65 20  s have the.same 
1f80: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 76  min() or max() v
1f90: 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  alue, then the c
1fa0: 6f 6c 75 6d 6e 73 20 76 61 6c 75 65 73 20 77 69  olumns values wi
1fb0: 6c 6c 20 62 65 20 63 68 6f 73 65 6e 20 61 72 62  ll be chosen arb
1fc0: 69 74 72 61 72 69 6c 79 0a 66 72 6f 6d 20 6f 6e  itrarily.from on
1fd0: 65 20 6f 66 20 74 68 6f 73 65 20 72 6f 77 73 2e  e of those rows.
1fe0: 0a 3c 70 3e 0a 46 6f 72 20 65 78 61 6d 70 6c 65  .<p>.For example
1ff0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 68 69 67   to find the hig
2000: 68 65 73 74 20 70 61 69 64 20 65 6d 70 6c 6f 79  hest paid employ
2010: 65 65 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ee:.<codeblock>.
2020: 53 45 4c 45 43 54 20 6d 61 78 28 73 61 6c 61 72  SELECT max(salar
2030: 79 29 2c 20 66 69 72 73 74 5f 6e 61 6d 65 2c 20  y), first_name, 
2040: 6c 61 73 74 5f 6e 61 6d 65 20 46 52 4f 4d 20 65  last_name FROM e
2050: 6d 70 6c 6f 79 65 65 3b 0a 3c 2f 63 6f 64 65 62  mployee;.</codeb
2060: 6c 6f 63 6b 3e 0a 3c 70 3e 0a 49 6e 20 74 68 65  lock>.<p>.In the
2070: 20 71 75 65 72 79 20 61 62 6f 76 65 2c 20 74 68   query above, th
2080: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
2090: 20 66 69 72 73 74 5f 6e 61 6d 65 20 61 6e 64 20   first_name and 
20a0: 6c 61 73 74 5f 6e 61 6d 65 20 63 6f 6c 75 6d 6e  last_name column
20b0: 73 0a 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e  s.will correspon
20c0: 64 20 74 6f 20 74 68 65 20 72 6f 77 20 74 68 61  d to the row tha
20d0: 74 20 73 61 74 69 73 66 69 65 64 20 74 68 65 20  t satisfied the 
20e0: 6d 61 78 28 73 61 6c 61 72 79 29 20 63 6f 6e 64  max(salary) cond
20f0: 69 74 69 6f 6e 2e 0a 0a 3c 6c 69 3e 3c 70 3e 0a  ition...<li><p>.
2100: 49 66 20 61 20 71 75 65 72 79 20 63 6f 6e 74 61  If a query conta
2110: 69 6e 73 20 6e 6f 20 61 67 67 72 65 67 61 74 65  ins no aggregate
2120: 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61 6c   functions at al
2130: 6c 2c 20 74 68 65 6e 20 61 20 47 52 4f 55 50 20  l, then a GROUP 
2140: 42 59 0a 63 6c 61 75 73 65 20 63 61 6e 20 62 65  BY.clause can be
2150: 20 61 64 64 65 64 20 61 73 20 61 20 73 75 62 73   added as a subs
2160: 74 69 74 75 74 65 20 6f 66 20 44 49 53 54 49 4e  titute of DISTIN
2170: 43 54 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 49  CT ON clause.  I
2180: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 6f  n other words,.o
2190: 75 74 70 75 74 20 72 6f 77 73 20 61 72 65 20 66  utput rows are f
21a0: 69 6c 74 65 72 65 64 20 73 6f 20 74 68 61 74 20  iltered so that 
21b0: 6f 6e 6c 79 20 6f 6e 65 20 72 6f 77 20 69 73 20  only one row is 
21c0: 73 68 6f 77 73 20 66 6f 72 20 65 61 63 68 20 64  shows for each d
21d0: 69 73 74 69 6e 63 74 0a 73 65 74 20 6f 66 20 76  istinct.set of v
21e0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 47 52 4f  alues in the GRO
21f0: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 49  UP BY clause.  I
2200: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 75  f two or more ou
2210: 74 70 75 74 20 72 6f 77 73 20 77 6f 75 6c 64 0a  tput rows would.
2220: 68 61 76 65 20 6f 74 68 65 72 77 69 73 65 20 68  have otherwise h
2230: 61 64 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  ad the same set 
2240: 6f 66 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  of values for th
2250: 65 20 47 52 4f 55 50 20 42 59 20 63 6f 6c 75 6d  e GROUP BY colum
2260: 6e 73 2c 20 74 68 65 6e 0a 74 68 65 20 6f 6e 65  ns, then.the one
2270: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69 73 20   of the rows is 
2280: 63 68 6f 73 65 6e 20 61 72 62 69 74 72 61 72 69  chosen arbitrari
2290: 6c 79 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 68 31 3e 44  ly..</ol>..<h1>D
22a0: 6f 65 73 20 4e 6f 74 20 44 6f 20 46 75 6c 6c 20  oes Not Do Full 
22b0: 55 6e 69 63 6f 64 65 20 43 61 73 65 20 46 6f 6c  Unicode Case Fol
22c0: 64 69 6e 67 20 42 79 20 44 65 66 61 75 6c 74 3c  ding By Default<
22d0: 2f 68 31 3e 0a 0a 3c 70 3e 0a 53 51 4c 69 74 65  /h1>..<p>.SQLite
22e0: 20 64 6f 65 73 20 6e 6f 74 20 6b 6e 6f 77 20 61   does not know a
22f0: 62 6f 75 74 20 74 68 65 20 75 70 70 65 72 2d 63  bout the upper-c
2300: 61 73 65 2f 6c 6f 77 65 72 2d 63 61 73 65 20 64  ase/lower-case d
2310: 69 73 74 69 6e 63 74 69 6f 6e 0a 66 6f 72 20 61  istinction.for a
2320: 6c 6c 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  ll unicode chara
2330: 63 74 65 72 73 2e 20 20 53 51 4c 20 66 75 6e 63  cters.  SQL func
2340: 74 69 6f 6e 73 20 6c 69 6b 65 0a 75 70 70 65 72  tions like.upper
2350: 28 29 20 61 6e 64 20 6c 6f 77 65 72 28 29 20 6f  () and lower() o
2360: 6e 6c 79 20 77 6f 72 6b 20 6f 6e 20 41 53 43 49  nly work on ASCI
2370: 49 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54  I characters.  T
2380: 68 65 72 65 20 61 72 65 20 74 77 6f 0a 72 65 61  here are two.rea
2390: 73 6f 6e 73 20 66 6f 72 20 74 68 69 73 3a 0a 3c  sons for this:.<
23a0: 6f 6c 3e 0a 3c 6c 69 3e 20 54 68 6f 75 67 68 20  ol>.<li> Though 
23b0: 73 74 61 62 6c 65 20 6e 6f 77 2c 20 77 68 65 6e  stable now, when
23c0: 20 53 51 4c 69 74 65 20 77 61 73 20 66 69 72 73   SQLite was firs
23d0: 74 20 64 65 73 69 67 6e 65 64 2c 20 74 68 65 20  t designed, the 
23e0: 72 75 6c 65 73 20 66 6f 72 0a 20 20 20 20 20 75  rules for.     u
23f0: 6e 69 63 6f 64 65 20 63 61 73 65 20 66 6f 6c 64  nicode case fold
2400: 69 6e 67 20 77 68 65 72 65 20 73 74 69 6c 6c 20  ing where still 
2410: 69 6e 20 66 6c 75 78 2e 20 20 54 68 61 74 20 6d  in flux.  That m
2420: 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a 20 20  eans that the.  
2430: 20 20 20 62 65 68 61 76 69 6f 72 20 6d 69 67 68     behavior migh
2440: 74 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 77  t have changed w
2450: 69 74 68 20 65 61 63 68 20 6e 65 77 20 75 6e 69  ith each new uni
2460: 63 6f 64 65 20 72 65 6c 65 61 73 65 2c 20 64 69  code release, di
2470: 73 72 75 70 74 69 6e 67 0a 20 20 20 20 20 61 70  srupting.     ap
2480: 70 6c 69 63 61 74 69 6f 6e 73 20 61 6e 64 20 63  plications and c
2490: 6f 72 72 75 70 74 69 6e 67 20 69 6e 64 65 78 65  orrupting indexe
24a0: 73 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73  s in the process
24b0: 2e 0a 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c 65  ..<li> The table
24c0: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
24d0: 6f 20 66 75 6c 6c 20 61 6e 64 20 70 72 6f 70 65  o full and prope
24e0: 72 20 75 6e 69 63 6f 64 65 20 63 61 73 65 20 66  r unicode case f
24f0: 6f 6c 64 69 6e 67 20 61 72 65 0a 20 20 20 20 20  olding are.     
2500: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
2510: 77 68 6f 6c 65 20 53 51 4c 69 74 65 20 6c 69 62  whole SQLite lib
2520: 72 61 72 79 2e 0a 3c 2f 6f 6c 3e 0a 3c 70 3e 0a  rary..</ol>.<p>.
2530: 46 75 6c 6c 20 75 6e 69 63 6f 64 65 20 63 61 73  Full unicode cas
2540: 65 20 66 6f 6c 64 69 6e 67 20 69 73 20 73 75 70  e folding is sup
2550: 70 6f 72 74 65 64 20 69 6e 20 53 51 4c 69 74 65  ported in SQLite
2560: 20 69 66 20 69 74 20 69 73 20 63 6f 6d 70 69 6c   if it is compil
2570: 65 64 0a 77 69 74 68 20 74 68 65 20 5b 2d 44 53  ed.with the [-DS
2580: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
2590: 5d 20 6f 70 74 69 6f 6e 20 61 6e 64 20 6c 69 6e  ] option and lin
25a0: 6b 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 0a  ked against the.
25b0: 5b 68 74 74 70 3a 2f 2f 73 69 74 65 2e 69 63 75  [http://site.icu
25c0: 2d 70 72 6f 6a 65 63 74 2e 6f 72 67 2f 7c 49 6e  -project.org/|In
25d0: 74 65 72 6e 61 74 69 6f 6e 61 6c 20 43 6f 6d 70  ternational Comp
25e0: 6f 6e 65 6e 74 73 20 66 6f 72 20 55 6e 69 63 6f  onents for Unico
25f0: 64 65 5d 0a 6c 69 62 72 61 72 79 2e 0a 0a 3c 74  de].library...<t
2600: 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 64  cl>hd_fragment d
2610: 62 6c 71 75 6f 74 65 20 7b 64 6f 75 62 6c 65 2d  blquote {double-
2620: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 6c 69  quoted string li
2630: 74 65 72 61 6c 7d 3c 2f 74 63 6c 3e 0a 3c 68 31  teral}</tcl>.<h1
2640: 3e 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 53  >Double-quoted S
2650: 74 72 69 6e 67 20 4c 69 74 65 72 61 6c 73 20 41  tring Literals A
2660: 72 65 20 41 63 63 65 70 74 65 64 3c 2f 68 31 3e  re Accepted</h1>
2670: 0a 0a 3c 70 3e 0a 54 68 65 20 53 51 4c 20 73 74  ..<p>.The SQL st
2680: 61 6e 64 61 72 64 20 73 61 79 73 20 74 68 61 74  andard says that
2690: 20 6f 6e 65 20 73 68 6f 75 6c 64 20 75 73 65 20   one should use 
26a0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20 61 72  double-quotes ar
26b0: 6f 75 6e 64 20 69 64 65 6e 74 69 66 69 65 72 73  ound identifiers
26c0: 0a 61 6e 64 20 73 69 6e 67 6c 65 2d 71 75 6f 74  .and single-quot
26d0: 65 73 20 61 72 6f 75 6e 64 20 73 74 72 69 6e 67  es around string
26e0: 20 6c 69 74 65 72 61 6c 73 2e 0a 3c 75 6c 3e 0a   literals..<ul>.
26f0: 3c 6c 69 3e 20 3c 74 74 3e 22 74 68 69 73 20 69  <li> <tt>"this i
2700: 73 20 61 20 6c 65 67 61 6c 20 53 51 4c 20 63 6f  s a legal SQL co
2710: 6c 75 6d 6e 20 6e 61 6d 65 22 3c 2f 74 74 3e 0a  lumn name"</tt>.
2720: 3c 6c 69 3e 20 3c 74 74 3e 27 74 68 69 73 20 69  <li> <tt>'this i
2730: 73 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20  s an SQL string 
2740: 6c 69 74 65 72 61 6c 27 3c 2f 74 74 3e 0a 3c 2f  literal'</tt>.</
2750: 75 6c 3e 0a 3c 70 3e 0a 53 51 4c 69 74 65 20 61  ul>.<p>.SQLite a
2760: 63 63 65 70 74 73 20 62 6f 74 68 20 6f 66 20 74  ccepts both of t
2770: 68 65 20 61 62 6f 76 65 2e 20 20 42 75 74 2c 20  he above.  But, 
2780: 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
2790: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 0a 77 69  be compatible.wi
27a0: 74 68 20 4d 79 53 51 4c 20 33 2e 78 20 28 77 68  th MySQL 3.x (wh
27b0: 69 63 68 20 77 61 73 20 77 69 64 65 6c 79 20 70  ich was widely p
27c0: 6f 70 75 6c 61 72 20 77 68 65 6e 20 53 51 4c 69  opular when SQLi
27d0: 74 65 20 77 61 73 20 66 69 72 73 74 20 62 65 69  te was first bei
27e0: 6e 67 0a 64 65 73 69 67 6e 65 64 29 20 77 69 6c  ng.designed) wil
27f0: 6c 20 61 6c 73 6f 20 75 73 65 20 63 6f 6e 74 65  l also use conte
2800: 6e 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  nt contained in 
2810: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20 61 73  double-quotes as
2820: 20 61 20 73 74 72 69 6e 67 0a 6c 69 74 65 72 61   a string.litera
2830: 6c 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  l if the content
2840: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2850: 61 6e 79 20 76 61 6c 69 64 20 69 64 65 6e 74 69  any valid identi
2860: 66 69 65 72 2e 0a 3c 70 3e 0a 41 6e 20 75 6e 66  fier..<p>.An unf
2870: 6f 72 74 75 6e 61 74 65 20 73 69 64 65 2d 65 66  ortunate side-ef
2880: 66 65 63 74 20 6f 66 20 74 68 69 73 20 69 73 20  fect of this is 
2890: 74 68 61 74 20 61 20 6d 69 73 73 70 65 6c 6c 65  that a misspelle
28a0: 64 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 0a  d double-quoted.
28b0: 69 64 65 6e 74 69 66 69 65 72 20 77 69 6c 6c 20  identifier will 
28c0: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
28d0: 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  s a string liter
28e0: 61 6c 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  al, rather than 
28f0: 67 65 6e 65 72 61 74 69 6e 67 0a 61 6e 20 65 72  generating.an er
2900: 72 6f 72 2e 0a 41 6e 6f 74 68 65 72 20 70 72 6f  ror..Another pro
2910: 62 6c 65 6d 20 69 73 20 74 68 61 74 20 74 68 69  blem is that thi
2920: 73 20 62 65 68 61 76 69 6f 72 20 61 6c 6c 6f 77  s behavior allow
2930: 73 20 64 65 76 65 6c 6f 70 65 72 73 20 77 68 6f  s developers who
2940: 20 61 72 65 20 6e 65 77 20 74 6f 0a 74 68 65 20   are new to.the 
2950: 53 51 4c 20 6c 61 6e 67 75 61 67 65 20 74 6f 20  SQL language to 
2960: 63 6f 6e 74 69 6e 75 65 20 75 73 69 6e 67 20 64  continue using d
2970: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
2980: 69 6e 67 20 6c 69 74 65 72 61 6c 73 20 77 68 65  ing literals whe
2990: 6e 20 74 68 65 79 0a 72 65 61 6c 6c 79 20 6e 65  n they.really ne
29a0: 65 64 20 74 6f 20 6c 65 61 72 6e 20 74 6f 20 75  ed to learn to u
29b0: 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  se the correct s
29c0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
29d0: 69 6e 67 20 6c 69 74 65 72 61 6c 20 66 6f 72 6d  ing literal form
29e0: 2e 0a 3c 70 3e 0a 49 6e 20 68 69 6e 64 73 69 67  ..<p>.In hindsig
29f0: 68 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e 6f  ht, we should no
2a00: 74 20 68 61 76 65 20 74 72 69 65 64 20 74 6f 20  t have tried to 
2a10: 6d 61 6b 65 20 53 51 4c 69 74 65 20 61 63 63 65  make SQLite acce
2a20: 70 74 20 4d 79 53 51 4c 20 33 2e 78 0a 73 79 6e  pt MySQL 3.x.syn
2a30: 74 61 78 2c 20 61 6e 64 20 73 68 6f 75 6c 64 20  tax, and should 
2a40: 68 61 76 65 20 6e 65 76 65 72 20 61 6c 6c 6f 77  have never allow
2a50: 65 64 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64  ed double-quoted
2a60: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   string literals
2a70: 2e 0a 48 6f 77 65 76 65 72 2c 20 77 65 20 63 6f  ..However, we co
2a80: 6e 74 69 6e 75 65 20 74 6f 20 73 75 70 70 6f 72  ntinue to suppor
2a90: 74 20 74 68 61 74 20 63 61 70 61 62 69 6c 69 74  t that capabilit
2aa0: 79 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b  y to avoid break
2ab0: 69 6e 67 20 6c 65 67 61 63 79 0a 61 70 70 6c 69  ing legacy.appli
2ac0: 63 61 74 69 6f 6e 73 2e 0a 3c 70 3e 0a 55 70 64  cations..<p>.Upd
2ad0: 61 74 65 3a 20 41 73 20 6f 66 20 53 51 4c 69 74  ate: As of SQLit
2ae0: 65 20 33 2e 32 37 2e 30 20 28 5b 64 61 74 65 6f  e 3.27.0 ([dateo
2af0: 66 3a 33 2e 32 37 2e 30 5d 29 20 74 68 65 20 75  f:3.27.0]) the u
2b00: 73 65 20 6f 66 20 61 20 64 6f 75 62 6c 65 2d 71  se of a double-q
2b10: 75 6f 74 65 64 0a 73 74 72 69 6e 67 20 6c 69 74  uoted.string lit
2b20: 65 72 61 6c 20 63 61 75 73 65 73 20 61 20 77 61  eral causes a wa
2b30: 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 20 74 6f  rning message to
2b40: 20 62 65 20 73 65 6e 74 20 74 6f 20 74 68 65 20   be sent to the 
2b50: 5b 65 72 72 6f 72 20 6c 6f 67 5d 2e 0a 0a 3c 68  [error log]...<h
2b60: 31 3e 4b 65 79 77 6f 72 64 73 20 43 61 6e 20 4f  1>Keywords Can O
2b70: 66 74 65 6e 20 42 65 20 55 73 65 64 20 41 73 20  ften Be Used As 
2b80: 49 64 65 6e 74 69 66 69 65 72 73 3c 2f 68 31 3e  Identifiers</h1>
2b90: 0a 0a 3c 70 3e 0a 54 68 65 20 53 51 4c 20 6c 61  ..<p>.The SQL la
2ba0: 6e 67 75 61 67 65 20 69 73 20 72 69 63 68 20 69  nguage is rich i
2bb0: 6e 20 6b 65 79 77 6f 72 64 73 2e 0a 4d 6f 73 74  n keywords..Most
2bc0: 20 53 51 4c 20 69 6d 70 6c 65 6d 65 6e 74 61 74   SQL implementat
2bd0: 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ions do not allo
2be0: 77 20 6b 65 79 77 6f 72 64 73 20 74 6f 20 62 65  w keywords to be
2bf0: 20 75 73 65 64 20 61 73 20 69 64 65 6e 74 69 66   used as identif
2c00: 69 65 72 73 0a 28 74 68 65 20 6e 61 6d 65 73 20  iers.(the names 
2c10: 6f 66 20 74 61 62 6c 65 20 6f 72 20 63 6f 6c 75  of table or colu
2c20: 6d 6e 73 29 20 75 6e 6c 65 73 73 20 74 68 65 79  mns) unless they
2c30: 20 61 72 65 20 65 6e 63 6c 6f 73 65 64 20 69 6e   are enclosed in
2c40: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a   double-quotes..
2c50: 42 75 74 20 53 51 4c 69 74 65 20 69 73 20 6d 6f  But SQLite is mo
2c60: 72 65 20 66 6c 65 78 69 62 6c 65 2e 20 20 4d 61  re flexible.  Ma
2c70: 6e 79 20 6b 65 79 77 6f 72 64 73 20 63 61 6e 20  ny keywords can 
2c80: 62 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74  be used as ident
2c90: 69 66 69 65 72 73 20 77 69 74 68 6f 75 74 0a 6e  ifiers without.n
2ca0: 65 65 64 69 6e 67 20 74 6f 20 62 65 20 71 75 6f  eeding to be quo
2cb0: 74 65 64 2c 20 61 73 20 6c 6f 6e 67 20 61 73 20  ted, as long as 
2cc0: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
2cd0: 72 65 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e  re used in a con
2ce0: 74 65 78 74 20 77 68 65 72 65 0a 69 74 20 69 73  text where.it is
2cf0: 20 63 6c 65 61 72 20 74 68 61 74 20 74 68 65 79   clear that they
2d00: 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f   are intended to
2d10: 20 62 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65   be an identifie
2d20: 72 2e 0a 3c 70 3e 0a 46 6f 72 20 65 78 61 6d 70  r..<p>.For examp
2d30: 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  le, the followin
2d40: 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 76  g statement is v
2d50: 61 6c 69 64 20 69 6e 20 53 51 4c 69 74 65 3a 0a  alid in SQLite:.
2d60: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 43 52 45 41  <codeblock>.CREA
2d70: 54 45 20 54 41 42 4c 45 20 75 6e 69 6f 6e 28 74  TE TABLE union(t
2d80: 72 75 65 20 49 4e 54 2c 20 77 69 74 68 20 42 4f  rue INT, with BO
2d90: 4f 4c 45 41 4e 29 3b 0a 3c 2f 63 6f 64 65 62 6c  OLEAN);.</codebl
2da0: 6f 63 6b 3e 0a 3c 70 3e 0a 54 68 65 20 73 61 6d  ock>.<p>.The sam
2db0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2dc0: 77 69 6c 6c 20 66 61 69 6c 20 6f 6e 20 65 76 65  will fail on eve
2dd0: 72 79 20 6f 74 68 65 72 20 53 51 4c 20 69 6d 70  ry other SQL imp
2de0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
2df0: 0a 77 65 20 6b 6e 6f 77 20 6f 66 20 64 75 65 20  .we know of due 
2e00: 74 6f 20 74 68 65 20 75 73 65 20 6f 66 20 6b 65  to the use of ke
2e10: 79 77 6f 72 64 73 20 22 75 6e 69 6f 6e 22 2c 20  ywords "union", 
2e20: 22 74 72 75 65 22 2c 20 61 6e 64 20 22 77 69 74  "true", and "wit
2e30: 68 22 20 61 73 0a 69 64 65 6e 74 69 66 69 65 72  h" as.identifier
2e40: 73 2e 0a 0a 3c 68 31 3e 44 75 62 69 6f 75 73 20  s...<h1>Dubious 
2e50: 53 51 4c 20 49 73 20 41 6c 6c 6f 77 65 64 20 57  SQL Is Allowed W
2e60: 69 74 68 6f 75 74 20 41 6e 79 20 45 72 72 6f 72  ithout Any Error
2e70: 20 4f 72 20 57 61 72 6e 69 6e 67 3c 2f 68 31 3e   Or Warning</h1>
2e80: 0a 0a 3c 70 3e 0a 54 68 65 20 6f 72 69 67 69 6e  ..<p>.The origin
2e90: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
2ea0: 6e 20 6f 66 20 53 51 4c 69 74 65 20 73 6f 75 67  n of SQLite soug
2eb0: 68 74 20 74 6f 20 66 6f 6c 6c 6f 77 0a 5b 68 74  ht to follow.[ht
2ec0: 74 70 73 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64  tps://en.wikiped
2ed0: 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 52 6f 62 75  ia.org/wiki/Robu
2ee0: 73 74 6e 65 73 73 5f 70 72 69 6e 63 69 70 6c 65  stness_principle
2ef0: 7c 50 6f 73 74 65 6c 27 73 20 4c 61 77 5d 20 77  |Postel's Law] w
2f00: 68 69 63 68 0a 73 74 61 74 65 73 20 69 6e 20 70  hich.states in p
2f10: 61 72 74 20 22 42 65 20 6c 69 62 65 72 61 6c 20  art "Be liberal 
2f20: 69 6e 20 77 68 61 74 20 79 6f 75 20 61 63 63 65  in what you acce
2f30: 70 74 22 2e 0a 54 68 69 73 20 75 73 65 64 20 74  pt"..This used t
2f40: 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  o be considered 
2f50: 67 6f 6f 64 20 64 65 73 69 67 6e 20 2d 20 74 68  good design - th
2f60: 61 74 20 61 20 73 79 73 74 65 6d 20 77 6f 75 6c  at a system woul
2f70: 64 20 61 63 63 65 70 74 0a 64 6f 64 67 79 20 69  d accept.dodgy i
2f80: 6e 70 75 74 73 20 61 6e 64 20 74 72 79 20 74 6f  nputs and try to
2f90: 20 64 6f 20 74 68 65 20 62 65 73 74 20 69 74 20   do the best it 
2fa0: 63 6f 75 6c 64 20 77 69 74 68 6f 75 74 20 63 6f  could without co
2fb0: 6d 70 6c 61 69 6e 69 6e 67 20 74 6f 6f 20 6d 75  mplaining too mu
2fc0: 63 68 2e 0a 42 75 74 20 6c 61 74 65 6c 79 2c 20  ch..But lately, 
2fd0: 70 65 6f 70 6c 65 20 68 61 76 65 20 63 6f 6d 65  people have come
2fe0: 20 74 6f 20 72 65 61 6c 69 7a 65 20 74 68 61 74   to realize that
2ff0: 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
3000: 20 62 65 74 74 65 72 20 74 6f 0a 62 65 20 73 74   better to.be st
3010: 72 69 63 74 20 69 6e 20 77 68 61 74 20 79 6f 75  rict in what you
3020: 20 61 63 63 65 70 74 2c 20 73 6f 20 61 73 20 74   accept, so as t
3030: 6f 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 66 69  o more easily fi
3040: 6e 64 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  nd errors in the
3050: 0a 69 6e 70 75 74 2e 0a 3c 70 3e 0a 0a 3c 68 31  .input..<p>..<h1
3060: 3e 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 44  >AUTOINCREMENT D
3070: 6f 65 73 20 4e 6f 74 20 57 6f 72 6b 20 54 68 65  oes Not Work The
3080: 20 53 61 6d 65 20 41 73 20 4d 79 53 51 4c 3c 2f   Same As MySQL</
3090: 68 31 3e 0a 0a 3c 70 3e 54 68 65 20 5b 41 55 54  h1>..<p>The [AUT
30a0: 4f 49 4e 43 52 45 4d 45 4e 54 5d 20 66 65 61 74  OINCREMENT] feat
30b0: 75 72 65 20 69 6e 20 53 51 4c 69 74 65 20 77 6f  ure in SQLite wo
30c0: 72 6b 73 20 64 69 66 66 65 72 65 6e 74 6c 79 20  rks differently 
30d0: 74 68 61 6e 0a 69 74 20 64 6f 65 73 20 69 6e 20  than.it does in 
30e0: 4d 79 53 51 4c 2e 20 20 54 68 69 73 20 6f 66 74  MySQL.  This oft
30f0: 65 6e 20 63 61 75 73 65 73 20 63 6f 6e 66 75 73  en causes confus
3100: 69 6f 6e 20 66 6f 72 20 70 65 6f 70 6c 65 20 77  ion for people w
3110: 68 6f 0a 69 6e 69 74 69 61 6c 6c 79 20 6c 65 61  ho.initially lea
3120: 72 6e 65 64 20 53 51 4c 20 6f 6e 20 4d 79 53 51  rned SQL on MySQ
3130: 4c 20 61 6e 64 20 74 68 65 6e 20 73 74 61 72 74  L and then start
3140: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 2c 20 61   using SQLite, a
3150: 6e 64 0a 65 78 70 65 63 74 20 74 68 65 20 74 77  nd.expect the tw
3160: 6f 20 73 79 73 74 65 6d 73 20 74 6f 20 77 6f 72  o systems to wor
3170: 6b 20 69 64 65 6e 74 69 63 61 6c 6c 79 2e 0a 0a  k identically...
3180: 3c 70 3e 53 65 65 20 74 68 65 20 5b 41 55 54 4f  <p>See the [AUTO
3190: 49 4e 43 52 45 4d 45 4e 54 7c 53 51 4c 69 74 65  INCREMENT|SQLite
31a0: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64   AUTOINCREMENT d
31b0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 5d 20 66 6f  ocumentation] fo
31c0: 72 0a 64 65 74 61 69 6c 65 64 20 69 6e 73 74 72  r.detailed instr
31d0: 75 63 74 69 6f 6e 73 20 6f 6e 20 77 68 61 74 20  uctions on what 
31e0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 6f  AUTOINCREMENT do
31f0: 65 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  es and does not 
3200: 64 6f 0a 69 6e 20 53 51 4c 69 74 65 2e 0a        do.in SQLite..