关于数据库字段NULL值问题


CDbColumnSchema::typecast()

这个方法是否可以考虑当数据库字段不允许为null时,这里就不要返回null?

举一个情况,添加新闻时,分类不选,是空值 ‘’ 传递到attribute中,因为分类Id为Int类型,经过 typecase() 过滤后,返回了null, 最终导致生成的sql执行抛错,抛错如下:


CDbCommand 无法执行 SQL 语句: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'category_id' cannot be null

那应该返回什么呢?

假如属性值是 null、’’ 空字符串,的话

————如果字段类型是字符串,则返回 ‘’ 空字符串,如果是Int或浮点的,就返回 0

你感觉呢?

我不是太确定。如果列定义了缺省值,那么null是更好的选择。

我定义了默认值,可是为什么还是跑那错误? 这个可得测试一下~~

测试结果:

字段设置了 not null default 0

sql为:INSERT INTO rl_banner (category_id, title) VALUES (NULL, ‘ttt’)

会抛错错误:#1048 - Column ‘category_id’ cannot be null

但在更新时,是不会抛错的。更新的sql也是将自动设置为null,但就会自动变成了 0,这又是怎么样的考虑?

总结:默认值,是当插入sql没有指定字段时生效。即使是指定为null,也不会触发默认值。

以上测试,是基于 MySQL 5

请qiang做一个评论~~