Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 9389)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -414,6 +414,8 @@
 
     def formfield(self, **kwargs):
         defaults = {'max_length': self.max_length}
+        if self.null:
+            defaults['empty_value'] = None
         defaults.update(kwargs)
         return super(CharField, self).formfield(**defaults)
 
@@ -785,6 +787,8 @@
 
     def formfield(self, **kwargs):
         defaults = {'widget': forms.Textarea}
+        if self.null:
+            defaults['empty_value'] = None
         defaults.update(kwargs)
         return super(TextField, self).formfield(**defaults)
 
Index: django/forms/fields.py
===================================================================
--- django/forms/fields.py	(revision 9389)
+++ django/forms/fields.py	(working copy)
@@ -139,15 +139,16 @@
         'min_length': _(u'Ensure this value has at least %(min)d characters (it has %(length)d).'),
     }
 
-    def __init__(self, max_length=None, min_length=None, *args, **kwargs):
+    def __init__(self, max_length=None, min_length=None, empty_value=u'', *args, **kwargs):
         self.max_length, self.min_length = max_length, min_length
+        self.empty_value = empty_value
         super(CharField, self).__init__(*args, **kwargs)
 
     def clean(self, value):
         "Validates max_length and min_length. Returns a Unicode object."
         super(CharField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return self.empty_value
         value = smart_unicode(value)
         value_length = len(value)
         if self.max_length is not None and value_length > self.max_length:
Index: tests/modeltests/model_forms/models.py
===================================================================
--- tests/modeltests/model_forms/models.py	(revision 9389)
+++ tests/modeltests/model_forms/models.py	(working copy)
@@ -168,6 +168,12 @@
     def __unicode__(self):
         return self.key
 
+class NullCharField(models.Model):
+    testfield = models.CharField(max_length=20, blank=True, null=True)
+    testfield2 = models.TextField(null=True, blank=True)
+    def __unicode__(self):
+        return unicode(self.testfield)
+
 __test__ = {'API_TESTS': """
 >>> from django import forms
 >>> from django.forms.models import ModelForm, model_to_dict
@@ -1277,6 +1283,25 @@
 >>> form.errors
 {'__all__': [u'Explicit pk with this Key and Desc already exists.'], 'key': [u'Explicit pk with this Key already exists.'], 'desc': [u'Explicit pk with this Desc already exists.']}
 
+# Ensure that char field with blank=True, null=True will be inserted as NULL not as ''
+>>> class NullCharFieldForm(ModelForm):
+...     class Meta:
+...         model = NullCharField
+...         fields = ('testfield', 'testfield2',)
+>>> form = NullCharFieldForm({'testfield': '', 'testfield2': ''})
+>>> form.is_valid()
+True
+>>> obj = form.save()
+>>> obj.testfield is None
+True
+>>> obj.testfield2 is None
+True
+>>> obj = NullCharField.objects.all()[0]
+>>> obj.testfield is None
+True
+>>> obj.testfield2 is None
+True
+
 # Choices on CharField and IntegerField
 >>> class ArticleForm(ModelForm):
 ...     class Meta:
