diff -r b4854b03c826 south/db/generic.py
--- a/south/db/generic.py	Thu Sep 09 14:56:13 2010 -0700
+++ b/south/db/generic.py	Fri Sep 10 19:28:38 2010 +0200
@@ -521,20 +521,15 @@
                     default = field.get_default()
                     # If the default is actually None, don't add a default term
                     if default is not None:
+                        # Add it in
                         # If the default is a callable, then call it!
                         if callable(default):
                             default = default()
-                        # Now do some very cheap quoting. TODO: Redesign return values to avoid this.
-                        if isinstance(default, basestring):
-                            default = "'%s'" % default.replace("'", "''")
-                        elif isinstance(default, (datetime.date, datetime.time, datetime.datetime)):
-                            default = "'%s'" % default
-                        # Escape any % signs in the output (bug #317)
-                        if isinstance(default, basestring):
-                            default = default.replace("%", "%%")
-                        # Add it in
+                        # Get the SQL representation of the value
+                        default = field.get_db_prep_save(default)
+                        default = self.get_sql_value_repr(default)
                         sql += " DEFAULT %s"
-                        sqlparams = (default)
+                        sqlparams = (default,)
                 elif (not field.null and field.blank) or (field.get_default() == ''):
                     if field.empty_strings_allowed and self._get_connection().features.interprets_empty_strings_as_nulls:
                         sql += " DEFAULT ''"
@@ -571,6 +566,21 @@
             return None
 
 
+    def get_sql_value_repr(self, value):
+        """
+        Get the SQL representation of *value*.
+        """
+        # Do some very cheap quoting. TODO: Redesign return values to avoid this.
+        if isinstance(value, basestring):
+            value = "'%s'" % value.replace("'", "''")
+        elif isinstance(value, (datetime.date, datetime.time, datetime.datetime)):
+            value = "'%s'" % value
+        # Escape any % signs in the output (bug #317)
+        if isinstance(value, basestring):
+            value = value.replace("%", "%%")
+        return value
+
+
     def _field_sanity(self, field):
         """
         Placeholder for DBMS-specific field alterations (some combos aren't valid,
diff -r b4854b03c826 south/db/sqlite3.py
--- a/south/db/sqlite3.py	Thu Sep 09 14:56:13 2010 -0700
+++ b/south/db/sqlite3.py	Fri Sep 10 19:28:38 2010 +0200
@@ -1,5 +1,6 @@
 import inspect
 import re
+import datetime
 
 from django.db.models import ForeignKey
 
@@ -168,3 +169,22 @@
     # No cascades on deletes
     def delete_table(self, table_name, cascade=True):
         generic.DatabaseOperations.delete_table(self, table_name, False)
+
+    def get_sql_value_repr(self, value):
+        """
+        Get the SQL representation of *value*.
+        """
+        # Do some very cheap quoting. TODO: Redesign return values to avoid this.
+        if isinstance(value, basestring):
+            value = "'%s'" % value.replace("'", "''")
+        elif isinstance(value, (datetime.date, datetime.time, datetime.datetime)):
+            value = "'%s'" % value
+        elif isinstance(value, bool):
+            if value:
+                value = 1
+            else:
+                value = 0
+        # Escape any % signs in the output (bug #317)
+        if isinstance(value, basestring):
+            value = value.replace("%", "%%")
+        return value        
