Index: db/backends/mysql_old/base.py
===================================================================
--- db/backends/mysql_old/base.py	(revision 5614)
+++ db/backends/mysql_old/base.py	(working copy)
@@ -14,6 +14,7 @@
 from MySQLdb.constants import FIELD_TYPE
 import types
 import re
+import weakref
 
 DatabaseError = Database.DatabaseError
 IntegrityError = Database.IntegrityError
@@ -102,9 +103,23 @@
             kwargs.update(self.options)
             self.connection = Database.connect(**kwargs)
             cursor = self.connection.cursor()
-            if self.connection.get_server_info() >= '4.1':
-                cursor.execute("SET NAMES 'utf8'")
-                cursor.execute("SET CHARACTER SET 'utf8'")
+            if self.connection.get_server_info() >= '4.1' and not self.connection.character_set_name().startswith('utf8'):
+                if hasattr(self.connection, 'charset'):
+                    # MySQLdb prior to 1.2.1p2 backwards-compat hacks.
+                    conn = self.connection
+                    cursor.execute("SET NAMES 'utf8'")
+                    cursor.execute("SET CHARACTER SET 'utf8'")
+                    # XXX: At this point, conn.charset is still wrong, so we
+                    # need to fix the converters. Writing to conn.charset gives
+                    # the same errors as the following code, btw.
+                    to_uni = lambda u, dummy=None, c=conn: c.literal(u.encode('utf-8'))
+                    from_uni = lambda u: u.decode('utf-8')
+                    conn.converter[unicode] = to_uni
+                    django_conversions[FIELD_TYPE.STRING] = from_uni
+                    django_conversions[FIELD_TYPE.VAR_STRING] = from_uni
+                    # Note: we don't handle FIELD_TYPE.BLOB here.
+                else:
+                    self.connection.set_character_set('utf8')
         else:
             cursor = self.connection.cursor()
         if settings.DEBUG:
