Jay A. Kreibich wrote:
> On Sun, Sep 23, 2012 at 09:25:06PM +0400, Yuriy Kaminskiy scratched on the 
> wall:
>> Jim Dodgen wrote:
> 
>>> I program mostly on Perl on Linux and it is a beautiful fit. Example
>>> is I can have a date field with a  POSIX time value (or offset) in it
>>> or another date related value like "unknown"
>> Very bad example. Standard SQL NULL is much better fit for "unknown".
>> Besides, perl at least have "use strict;" and "use warnings;", sqlite does
>> not.
> 
>   Yet SQLite's types are often more clearly defined than Perl's.  Every
>   SQLite value has a specific, known type that will tell you exactly
>   how the bits are stored.  The only difference with SQLite is that
>   columns are allowed to have mixed types.  Don't confuse this with a
>   loosely typed language, however... again: every SQLite value has a
>   specific and known type.
> 
> 
>   From a formal mathematical sense, a relational NULL is considered a
>   "value-less type."  That is, it is treated as a specific data type
>   that's value domain is the null-set.
> 
>   So, if you want to get real formal, all relational databases allow
>   multiple types (at least two) to be assigned to a row attribute.
>   I know that sounds contrived, but when you start to look at NULL
>   handling in SQL in this way, it suddenly makes a lot more sense.
>   And it means that all SQL databases already deal with disjoint types
>   within a column.
> 
>   If formal theory isn't your way thing, I'd point out that "traditional"
>   database do all kinds of automatic type conversions.  When you input
>   a date in MySQL, you do so as a string.  When you get a date or
>   duration value back, it is usually as a string.  If you compare a
>   date column to a literal string (that, one assumes, represents a
>   date) the database will do its best to covert that string to
>   something that makes sense before doing the comparison.  Similar
>   things can be said of different numeric types... "WHERE floatCol < 3" 
>   will do automatic conversions and get on with it.
>   
>   The typical database has all kinds of automatic rules about dealing
>   with different types involved in the same operation.  SQLite has all
>   these rules as well...  and they're all clearly defined, and they all
>   work pretty much the same way.  The fact that a column is only loosely
>   typed really doesn't come into play in a significant way, except that
>   the conversion rules for a comparison may come up in a JOIN, while
>   other databases would typically only see a converted comparison in
>   a WHERE. 
>   
>   The end result is not mass chaos but, rather, rarely a surprise.
>   SQLite does a lot of type conversion-- just like every other database
>   out there-- to deal with disjoint types.  Those conversion rules are
>   well documented and make sense.
> 
> 
> 
>   I'm a bit of purest, and when I first started using SQLite eight
>   years ago, I was also a bit off-put by what I saw as "fast and loose"
>   typing.  Over many years of using SQLite for all kinds of things, I
>   can say that this has never been an issue.  It has never surprised
>   me, it has never caused problems-- and it occasionally has been darn
>   handy.
> 
> 
> 
>   And finally, for anyone that really wants strong typing, that's easy
>   enough to do.  Just add a check constraint to your column defs:
>   
>   CREATE TABLE t (
>       i  integer   CHECK ( typeof( i ) == 'integer' ),
>       t  text      CHECK ( typeof( t ) == 'text' ),
>       r  float     CHECK ( typeof( r ) == 'real' ),
>       b  blob      CHECK ( typeof( b ) == 'blob' )
>   );

Won't help with catching error in
DELETE ... WHERE day >= 2012-03-15 -- oops, just deleted records from 1994 year

Won't help with catching error when (SELECT ...) >= (SELECT ...) suddenly uses
string comparison instead of numerical (9 >= 19 vs '9' >= '19').

Yes, sqlite rules documented, yes, you can always explain why it behaved the way
it did, still nasty surprises happens, especially with newbies (and sometimes
not only with newbies).

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to