Index: db/models/fields/__init__.py
===================================================================
--- db/models/fields/__init__.py	(revision 8255)
+++ db/models/fields/__init__.py	(working copy)
@@ -150,8 +150,13 @@
         # mapped to one of the built-in Django field types. In this case, you
         # can implement db_type() instead of get_internal_type() to specify
         # exactly which wacky database column type you want to use.
-        data = DictWrapper(self.__dict__, connection.ops.quote_name, "qn_")
         try:
+            data = get_creation_module().backend_parameters(self, self.__dict__)
+        except AttributeError:
+            # No backend_parameters provided in backend
+            data = self.__dict__
+        data = DictWrapper(data, connection.ops.quote_name, "qn_")
+        try:
             return get_creation_module().DATA_TYPES[self.get_internal_type()] % data
         except KeyError:
             return None
Index: db/backends/mysql/base.py
===================================================================
--- db/backends/mysql/base.py	(revision 8255)
+++ db/backends/mysql/base.py	(working copy)
@@ -21,7 +21,7 @@
     raise ImproperlyConfigured("MySQLdb-1.2.1p2 or newer is required; you have %s" % Database.__version__)
 
 from MySQLdb.converters import conversions
-from MySQLdb.constants import FIELD_TYPE
+from MySQLdb.constants import FIELD_TYPE, FLAG
 import re
 
 # Raise exceptions for database warnings if DEBUG is on
@@ -39,11 +39,18 @@
 # TIME columns as timedelta -- they are more like timedelta in terms of actual
 # behavior as they are signed and include days -- and Django expects time, so
 # we still need to override that.
+
 django_conversions = conversions.copy()
 django_conversions.update({
     FIELD_TYPE.TIME: util.typecast_time,
     FIELD_TYPE.DECIMAL: util.typecast_decimal,
     FIELD_TYPE.NEWDECIMAL: util.typecast_decimal,
+    # By default, mysqldb will return VARCHAR BINARY fields as type str.
+    # This is a bad idea, as BINARY doesn't indicate that it's arbitrary
+    # binary data, but that collation uses the binary representation.
+    # Replacing the list makes it return unicode; mysqldb later adds
+    # another list entry for non-binary fields.
+    FIELD_TYPE.VARCHAR: [(FLAG.BINARY, lambda s: s.decode('utf-8'))],
 })
 
 # This should match the numerical portion of the version numbers (we can treat
Index: db/backends/mysql/creation.py
===================================================================
--- db/backends/mysql/creation.py	(revision 8255)
+++ db/backends/mysql/creation.py	(working copy)
@@ -5,7 +5,7 @@
 DATA_TYPES = {
     'AutoField':         'integer AUTO_INCREMENT',
     'BooleanField':      'bool',
-    'CharField':         'varchar(%(max_length)s)',
+    'CharField':         'varchar(%(max_length)s) %(binary)s',
     'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
     'DateField':         'date',
     'DateTimeField':     'datetime',
@@ -20,9 +20,19 @@
     'PhoneNumberField':  'varchar(20)',
     'PositiveIntegerField': 'integer UNSIGNED',
     'PositiveSmallIntegerField': 'smallint UNSIGNED',
-    'SlugField':         'varchar(%(max_length)s)',
+    'SlugField':         'varchar(%(max_length)s) BINARY',
     'SmallIntegerField': 'smallint',
     'TextField':         'longtext',
     'TimeField':         'time',
     'USStateField':      'varchar(2)',
 }
+
+
+def backend_parameters(field, field_dict):
+    """
+    For MySQL a unique CharField has to be created as a BINARY column as 
+    database level.
+    """
+    if field.unique and field.get_internal_type() == 'CharField':
+        return dict(field_dict, binary='BINARY')
+    return dict(field_dict, binary='')
