2016-04-15 19:47 GMT+02:00 Dominique Devienne <ddevienne at gmail.com>:
> On Fri, Apr 15, 2016 at 3:56 PM, Cecil Westerhof <cldwesterhof at gmail.com>
> wrote:
>
> > 2016-04-15 8:45 GMT+02:00 Dominique Devienne <ddevienne at gmail.com>:
> > > On Thu, Apr 14, 2016 at 9:30 PM, Cecil Westerhof <
> cldwesterhof at gmail.com>>
> > wrote:
> >
> > ?Is there a way to convert a hex string to a blob? I did not find it
> yet.?
> >
>
> I didn't find one either (see below), beside formatting a SQL statement
> with a blob literal,
> kinda like sprintf(..., "x'%s'", hex_string), which is hardly an option.
> I'm surprised there's no built-in function or SQL way to do it.
> I suspect there is, and I'm missing something. Hopefully someone will chime
> in.
>
> Perhaps a CTE could do it.
?I have to delve in that also. You are taking my sleep away. ;-)
?
> I'd reach for C/C++ and custom functions for
> such things.
>
?I am probably going to work with Java, but when exploring I am using Bash
and SQLite Browser.
In a program I have been testing with UUID, I had:
ps.setBytes(1, getRandomUUIDBlob());
and the function itself:
private static byte[] getRandomUUIDBlob() {
ByteBuffer bb;
byte[] bytes = new byte[16];
UUID uuid = UUID.randomUUID();
bb = ByteBuffer.wrap(bytes);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bytes;
}
This worked. I have to clean it up to show some strange things I noticed.
(In my eyes.)
?
> (I'd use a UDF for the printing part as well, I suspect it's faster that
> way, but didn't measure it).
>
?And something else to keep me awake. ;-)?
> C:\Users\DDevienne>sqlite3
> SQLite version 3.10.2 2016-01-20 15:27:19
> Enter ".help" for usage hints.
> Connected to a transient in-memory database.
> Use ".open FILENAME" to reopen on a persistent database.
> sqlite>
> sqlite> select typeof(x'ab');
> blob
> sqlite> select typeof('ab');
> text
> sqlite> select typeof(cast('ab' as blob));
> blob
> sqlite> select hex(x'ab');
> AB
> sqlite> select hex(cast('ab' as blob));
> 6162
> sqlite>
>
?Here I get a blob:
sqlite> WITH UUIDTable AS (
...> SELECT '3DBA81DE-7AA7-412E-954F-5B2DA8D4AB6C' AS UUIDStr
...> )
...> SELECT TYPEOF(CAST(SUBSTR(UUIDStr, 1, 8) ||
...> SUBSTR(UUIDStr, 10, 4) ||
...> SUBSTR(UUIDStr, 15, 4) ||
...> SUBSTR(UUIDStr, 20, 4) ||
...> SUBSTR(UUIDStr, 25, 12) AS blob))
...> FROM UUIDTable
...> ;
blob
But when I do not use TYPEOF I get a string instead of a blob:
sqlite> WITH UUIDTable AS (
...> SELECT '3DBA81DE-7AA7-412E-954F-5B2DA8D4AB6C' AS UUIDStr
...> )
...> SELECT CAST(SUBSTR(UUIDStr, 1, 8) ||
...> SUBSTR(UUIDStr, 10, 4) ||
...> SUBSTR(UUIDStr, 15, 4) ||
...> SUBSTR(UUIDStr, 20, 4) ||
...> SUBSTR(UUIDStr, 25, 12) AS blob)
...> FROM UUIDTable
...> ;
3DBA81DE7AA7412E954F5B2DA8D4AB6C
What am I doing wrong?
--
Cecil Westerhof