When I declare something in the SQL schema as: foo int not_null then: validates_presence_of :foo has no effect. That is, AR allows an uninitialized version of foo to be written to the database which (in the case of mysql) fulfills the "not_null" constraint by writing a zero. I routinely use "not_null" if something is never supposed to be null, simply because it saves storage space (as I recall, mysql uses an extra byte of storage for each not_null numeric column, at least). I find these semantics surprising. Is this behaviour intentional? Bob