Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.756.2.8
diff -u -r1.756.2.8 common.inc
--- includes/common.inc	27 Feb 2008 20:28:03 -0000	1.756.2.8
+++ includes/common.inc	3 Mar 2008 22:05:09 -0000
@@ -3249,8 +3249,11 @@
       continue;
     }
 
+    // array_key_exists() is used to catch fields explicitly set to NULL.
+    // We try a faster isset() first to preserve performance.
+
     // For inserts, populate defaults from Schema if not already provided
-    if (!isset($object->$field) && !count($update) && isset($info['default'])) {
+    if (!isset($object->$field) && !array_key_exists($field, $object) && !count($update) && isset($info['default'])) {
       $object->$field = $info['default'];
     }
 
@@ -3258,19 +3261,19 @@
     if ($info['type'] == 'serial') {
       $serials[] = $field;
       // Ignore values for serials when inserting data. Unsupported.
-      unset($object->$field);
+      continue;
     }
 
     // Build arrays for the fields, placeholders, and values in our query.
-    if (isset($object->$field)) {
+    if (isset($object->$field) || array_key_exists($field, $object)) {
       $fields[] = $field;
-      $placeholders[] = db_type_placeholder($info['type']);
-
-      if (empty($info['serialize'])) {
-        $values[] = $object->$field;
+      if (isset($object->$field)) {
+        $placeholders[] = db_type_placeholder($info['type']);
+        $values[] = empty($info['serialize']) ? $object->$field : serialize($object->$field);
       }
       else {
-        $values[] = serialize($object->$field);
+        $placeholders[] = '%s';
+        $values[] = 'NULL';
       }
     }
   }
