Index: django/forms/fields.py
===================================================================
--- django/forms/fields.py	(revision 9464)
+++ django/forms/fields.py	(working copy)
@@ -582,7 +582,7 @@
         # Explicitly check for the string 'False', which is what a hidden field
         # will submit for False. Because bool("True") == True, we don't need to
         # handle that explicitly.
-        if value == 'False':
+        if value in ('False', '0'):
             value = False
         else:
             value = bool(value)
@@ -601,13 +601,13 @@
     def clean(self, value):
         """
         Explicitly checks for the string 'True' and 'False', which is what a
-        hidden field will submit for True and False. Unlike the
-        Booleanfield we also need to check for True, because we are not using
-        the bool() function
+        hidden field will submit for True and False. Also checks for '1' and '0'
+        for MySQL compatibility. Unlike the Booleanfield we also need to check
+        for True, because we are not using the bool() function.
         """
-        if value in (True, 'True'):
+        if value in (True, 'True', '1'):
             return True
-        elif value in (False, 'False'):
+        elif value in (False, 'False', '0'):
             return False
         else:
             return None
Index: tests/regressiontests/forms/fields.py
===================================================================
--- tests/regressiontests/forms/fields.py	(revision 9464)
+++ tests/regressiontests/forms/fields.py	(working copy)
@@ -1019,6 +1019,10 @@
 True
 >>> f.clean(0)
 False
+>>> f.clean('1')
+True
+>>> f.clean('0')
+False
 >>> f.clean('Django rocks')
 True
 
@@ -1143,7 +1147,10 @@
 >>> f.clean(False)
 False
 >>> f.clean(None)
+>>> f.clean('0')
+False
 >>> f.clean('1')
+True
 >>> f.clean('2')
 >>> f.clean('3')
 >>> f.clean('hello')
@@ -1162,6 +1169,21 @@
 >>> f.cleaned_data['hidden_nullbool2']
 False
 
+# Make sure we're compatible with MySQL, which uses 0 and 1 for its boolean
+# values.
+>>> NULLBOOL_CHOICES = (('1', 'Yes'), ('0', 'No'), ('', 'Unknown'))
+>>> class MySQLNullBooleanForm(Form):
+...     nullbool0 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
+...     nullbool1 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
+...     nullbool2 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
+>>> f = MySQLNullBooleanForm({ 'nullbool0': '1', 'nullbool1': '0', 'nullbool2': '' })
+>>> f.full_clean()
+>>> f.cleaned_data['nullbool0']
+True
+>>> f.cleaned_data['nullbool1']
+False
+>>> f.cleaned_data['nullbool2']
+
 # MultipleChoiceField #########################################################
 
 >>> f = MultipleChoiceField(choices=[('1', 'One'), ('2', 'Two')])
