On 06/11/2010, at 21:28, Jay A. Kreibich wrote:

> On Sat, Nov 06, 2010 at 08:35:10PM -0300, Tito Ciuro scratched on the wall:
>> Hello,
>> 
>> I have a question about manifest typing/data affinity. Assume I have 
>> created this table:
>> 
>> CREATE TABLE foo (ROWID INTEGER PRIMARY KEY, key TEXT, attr TEXT, value 
>> NONE);
>> 
>> I was reading the Using SQLite book and came across page #38 (#60 on
>> the PDF version) where it states:
> 
> 
>  I hope the book is proving useful.
> 
> 
>> "None: A column with a none affinity has no preference over storage
>> class.  Each value is stored as the type provided, with no attempt
>> to convert anything."
>> 
>> So it seems that using NONE is a hint that different data types are
>> going to be stored in that column, correct?
> 
>  I suppose you could look at it that way, but it isn't meant to be
>  explicit.
> 
>  With the exception of an INTEGER PRIMARY KEY, any column can hold
>  row-values of any type.  The affinity will influence stored values
>  to specific types, but it does not prevent other types from being
>  stored if the conversion cannot be made.
> 
>  The NONE affinity simply indicates to the database that you always
>  store values in their provided type, and that no conversions should
>  be attempted, even if a conversion could be done in a loss-less way.
> 
>> My main question has to do with binding values to precompiled statements.
>> For the value column, should I:
>> 
>> a) use sqlite3_bind_value()?
> 
>  sqlite3_bind_value() is for binding "sqlite3_value" data structures.
>  If you have one of those (from an sqlite3_column_value(), for
>  example), and it is in the type representation you want (text,
>  int, etc), then go ahead and use it.
> 
>  If you're binding a more traditional value, such as a string or
>  integer, you should use one of the sqlite3_bind_text(),
>  sqlite3_bind_int(), or similar functions.
> 
>  The bind function you choose will set the "type" of the value.
>  If the column has a NONE affinity, no conversion will be attempted
>  and the value, in the representation you provided, will be stored
>  directly.
> 
>> b) store it as a string using sqlite3_bind_text()? Will
>> sqlite3_bind_text() allow SQLite to choose the proper data affinity
>> even though I'm binding it as text?
> 
>  An affinity is a property of a table column.  The affinity of a
>  column is defined by the "SQL type" passed to CREATE TABLE.  Once the
>  table has been created, the affinity of each column is set.  So the
>  only time SQLite "chooses" an affinity is when it parses the CREATE
>  TABLE statement.
> 
>  So, for example, if you have an INSERT statement that binds a text
>  value to a parameter used to set a column with a NONE affinity, the
>  value in the new row will *always* be stored as a text value,
>  regardless of the string value.  If you were to bind an integer, the
>  value would always be stored as an integer, and so on.
> 
>  This would work differently if the column had a NUMERIC affinity, for
>  example.  In that case, binding the string "abc" would result in
>  storage of a text value, while binding the string "132" would result
>  in an integer and "85.3" would result in a floating-point.  Binding
>  43 (the integer, not a two-character string, using sqlite3_bind_int())
>  would result in an integer as well.  
> 
> 
> 
>  As you might know, you can use different sqlite3_column_xxx() functions
>  to extract values in a specific representation (type), even if that 
>  returned representation does not match the type of the stored value.
>  For example, if you know you're going to print out a value, you can
>  use sqlite3_column_text() to get a text representation of the value,
>  even if that value is stored in the database as an integer.  The
>  conversions used for this are given in table 7.1 of Using SQLite.
> 
>  On the input side, you can use different sqlite3_bind_xxx() function
>  to provide values in a representation (type) that might not match the
>  type used to actually store the value.  The affinity defines your
>  "preferred" storage type, and is used as a hint to do input
>  conversions.  So if you're taking use input for a number, you can
>  take the text value passed in by your applications GUI and pass that
>  directly to sqlite3_bind_text(), even if the string represents a
>  number, and you want to store it as a number (and have told the
>  database this by using an INTEGER, REAL, or NUMERIC affinity).
> 
>  The NONE affinity is simply a way of saying that you will always
>  provide values in the representation that should be used to
>  store them.  This means that the specific sqlite3_bind_xxx() function
>  you choose more or less sets the type of the value.
> 
>    -j
> 
> -- 
> Jay A. Kreibich < J A Y  @  K R E I B I.C H >
> 
> "Intelligence is like underwear: it is important that you have it,
> but showing it to the wrong people has the tendency to make them
> feel uncomfortable." -- Angela Johnson
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

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

Reply via email to