diff --git a/django/core/cache/backends/db.py b/django/core/cache/backends/db.py
index 4e81ec29f1..eb459a076d 100644
--- a/django/core/cache/backends/db.py
+++ b/django/core/cache/backends/db.py
@@ -35,7 +35,8 @@ class CacheClass(BaseCache):
             cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % self._table, [key])
             transaction.commit_unless_managed()
             return default
-        return pickle.loads(base64.decodestring(row[1]))
+        value = connection.ops.process_clob(row[1])
+        return pickle.loads(base64.decodestring(value))
 
     def set(self, key, value, timeout=None):
         self._base_set('set', key, value, timeout)
diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py
index 1c057c3358..6dcc17f4f2 100644
--- a/django/db/backends/__init__.py
+++ b/django/db/backends/__init__.py
@@ -255,6 +255,13 @@ class BaseDatabaseOperations(object):
         """
         return 'DEFAULT'
 
+    def process_clob(self, value):
+        """
+        Returns the value of a CLOB column, for backends that return a locator
+        object that requires additional processing.
+        """
+        return value
+
     def return_insert_id(self):
         """
         For backends that support returning the last insert ID as part
diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py
index 109ec5bd9f..6000e32f3a 100644
--- a/django/db/backends/oracle/base.py
+++ b/django/db/backends/oracle/base.py
@@ -123,6 +123,11 @@ WHEN (new.%(col_name)s IS NULL)
     def prep_for_iexact_query(self, x):
         return x
 
+    def process_clob(self, value):
+        if value is None:
+            return u''
+        return force_unicode(value.read())
+
     def query_class(self, DefaultQueryClass):
         return query.query_class(DefaultQueryClass, Database)