--- django/db/backends/mysql/base.py.orig	2009-12-01 09:36:42.000000000 +0100
+++ django/db/backends/mysql/base.py	2009-12-01 09:37:01.000000000 +0100
@@ -80,24 +80,30 @@
         self.cursor = cursor
 
     def execute(self, query, args=None):
-        try:
-            return self.cursor.execute(query, args)
-        except Database.OperationalError, e:
-            # Map some error codes to IntegrityError, since they seem to be
-            # misclassified and Django would prefer the more logical place.
-            if e[0] in self.codes_for_integrityerror:
-                raise Database.IntegrityError(tuple(e))
-            raise
+        return self._execute_and_catch(self.cursor.execute, query, args)
 
     def executemany(self, query, args):
+        return self._execute_and_catch(self.cursor.executemany, query, args)
+
+    def _execute_and_catch(self, execute_func, query, args):
         try:
-            return self.cursor.executemany(query, args)
+            return execute_func(query, args)
         except Database.OperationalError, e:
             # Map some error codes to IntegrityError, since they seem to be
             # misclassified and Django would prefer the more logical place.
             if e[0] in self.codes_for_integrityerror:
                 raise Database.IntegrityError(tuple(e))
             raise
+        except Database.Warning, e:
+            try:
+                # Some warnings really are Notes, like with an DROP TABLE IF EXISTS.
+                # We don't want to raise those.
+                warnings = self.cursor.connection.show_warnings()
+                if not (False in [i[0] == 'Note' for i in warnings]): # older python lacks any()
+                    return None
+            except AttributeError: # older mysql does not have show_warnings()
+                pass
+            raise
 
     def __getattr__(self, attr):
         if attr in self.__dict__:
