On Fri, 02 Sep 2016 15:10 +0100, Tim Streater <t...@clothears.org.uk> wrote:
> On 02 Sep 2016 at 15:05, Dave Blake <davebl...@kodi.tv> wrote:
>
>> Can I confirm that defining feilds as VARCHAR(20) rather than TEXT, if I
>> know I only want 20 chars or less,  will result in a smaller database?
>
> Makes no difference whatever.

Mr. Streater's answer to Mr. Blake's question is correct:  TEXT vs
VARCHAR(20) make no difference at all in the file format.

But for completeness, let me just point out that there is a difference
between these two declarations from the point of view of the query
planner.  When the query planner sees VARCHAR(20) versus (say)
VARCHAR(2000) it assumes that the second field will usually store
about 100 times as much text as the first.  In other words, it uses
the argument to VARCHAR as an estimate for the average size of the
field.  This goes into building an estimate for the average size of
each row.  When trying to decide between two indexes, if all else is
equal, SQLite will choose the index with the smaller estimated row
size.

So, while the declared type makes very little difference, and though
it makes no difference at all with regard to how content is stored on
disk, the declared type is not totally ignored by SQLite and does have
some small influence on query planning.  Note that the difference is
quite small and it takes a subtle experiment (and a subtle test case)
to verify that the size estimation logic is working.

For size estimating purposes, SQLite treats "TEXT" as if it were
"VARCHAR(20)".  https://www.sqlite.org/src/artifact/c2ccfcd?ln=1195

-- 
D. Richard Hipp
d...@sqlite.org
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to