Do you plan on adding support for binary data in the future to overcome
some of the issues you mentioned?

--eric


On Thu, Feb 19, 2004 at 03:23:17PM -0800, D. Richard Hipp wrote:
> Eric Kolve wrote:
> > 
> > I guess what I am asking for is transparent handling of binary data.
> > You shouldn't have to escape anything, other clients shouldn't have to
> > know you escaped anything and you shouldn't have to encode the data.
> > 
> 
> The current version of SQLite has some support for binary
> data.  But SQLite is not 100% ready to handle binary
> data just yet.  To be safe, you should consider encoding
> your data into a form that does not contain \000 characters.
> The sqlite_encode_binary() and sqlite_decode_binary()
> functions work well for this.
> 
> You cannot insert binary data using an INSERT statement
> in SQL.  Why not?  Because any \000 character in the binary
> data will appear to the parser to be the end of the
> INSERT statement and you will end up with a syntax error.
> So you cannot insert binary data using sqlite_exec().  But
> you can insert binary data using sqlite_compile().  Using
> sqlite_compile() your SQL statement can contain a '?'
> character any place it is legal to put a string constant.
> So you can say things like this:
> 
>      INSERT INTO t1(x) VALUES(?);
> 
> Then you can use the sqlite_bind() API to bind the data
> you want the ? to represent.  sqlite_bind() allows you
> to bind arbitrary length binary data.
> 
> This works, mostly.  As currently implemented SQLite cannot
> accept binary data in an indexed column or primary key.
> (It's going to take a file format change to fix that
> problem.)  But how often do you want an index on binary
> data anyhow?
> 
> There is also a little bit of a problem getting the
> binary data back out.  Using either the sqlite_exec()
> callback or the sqlite_step() APIs, all you get is a
> pointer to the beginning of the binary data - you are
> not told its length.  SQLite knows the length internally,
> it just isn't telling you.  We hope to fix that
> deficiency soon.  In the meantime, just store the
> length in a separate column.
> 
> You should also avoid trying to transform binary data
> using built-in operators or SQL functions.  They will
> not, for the most part, work.  With binary data, about
> all you can do is store and retrieve it.
> 
> Here is the biggest show-stopper: If you VACUUM a
> database that contains binary data, it will truncate
> the binary data at the first \000 character.  The
> same thing happens if you try to ".dump" the database
> into an ascii text file.  These are really the same
> problem because VACUUM works internally by doing a
> ".dump" and piping the results into a new database.
> At some point, I'll probably work around this by
> implementing optional mysql-style backslash escapes
> so that the \000 characters in binary data can be
> represented by the 4-character sequence "\000".  This
> would be OFF by default (for SQL compatibility) but
> be selectable ON using a pragma.
> 
> -- 
> D. Richard Hipp -- [EMAIL PROTECTED] -- 704.948.4565
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to