diff --git a/django/core/management/commands/inspectdb.py b/django/core/management/commands/inspectdb.py
index 5f0e278..e6d142b 100644
--- a/django/core/management/commands/inspectdb.py
+++ b/django/core/management/commands/inspectdb.py
@@ -151,8 +151,13 @@ class Command(NoArgsCommand):
             field_params['max_length'] = row[3]
 
         if field_type == 'DecimalField':
-            field_params['max_digits'] = row[4]
-            field_params['decimal_places'] = row[5]
+            if not row[4] or not row[5]:
+                field_notes.append('''max_digits and decimal_places have been guessed, as this database handles decimal fields as float''')
+                max_digits, decimal_places = 10, 5
+            else:
+                max_digits, decimal_places = row[4], row[5]
+            field_params['max_digits'] = max_digits
+            field_params['decimal_places'] = decimal_places
 
         return field_type, field_params, field_notes
 
diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py
index 9e1518b..b1893d4 100644
--- a/django/db/backends/mysql/introspection.py
+++ b/django/db/backends/mysql/introspection.py
@@ -36,7 +36,12 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
     def get_table_description(self, cursor, table_name):
         "Returns a description of the table, with the DB-API cursor.description interface."
         cursor.execute("SELECT * FROM %s LIMIT 1" % self.connection.ops.quote_name(table_name))
-        return cursor.description
+        # Decimal fields return length + 2, see #5014
+        fixed_description = [list(col_info) for col_info in cursor.description]
+        for col_info in fixed_description:
+            if col_info[1] in (FIELD_TYPE.DECIMAL, FIELD_TYPE.NEWDECIMAL):
+                col_info[4] -= 2
+        return fixed_description
 
     def _name_to_index(self, cursor, table_name):
         """
diff --git a/django/db/backends/sqlite3/introspection.py b/django/db/backends/sqlite3/introspection.py
index 5ee7b64..d34a06b 100644
--- a/django/db/backends/sqlite3/introspection.py
+++ b/django/db/backends/sqlite3/introspection.py
@@ -20,6 +20,7 @@ class FlexibleFieldLookupDict(object):
         'integer unsigned': 'PositiveIntegerField',
         'decimal': 'DecimalField',
         'real': 'FloatField',
+        'numeric': 'FloatField',
         'text': 'TextField',
         'char': 'CharField',
         'date': 'DateField',
diff --git a/tests/regressiontests/inspectdb/models.py b/tests/regressiontests/inspectdb/models.py
index fc2548b..0111cc5 100644
--- a/tests/regressiontests/inspectdb/models.py
+++ b/tests/regressiontests/inspectdb/models.py
@@ -6,3 +6,6 @@ class People(models.Model):
 
 class Message(models.Model):
     from_field = models.ForeignKey(People, db_column='from_id')
+
+class DecimalTest(models.Model):
+    dec_field = models.DecimalField(max_digits=10, decimal_places=5)
diff --git a/tests/regressiontests/inspectdb/tests.py b/tests/regressiontests/inspectdb/tests.py
index 683e6e9..5b5cf39 100644
--- a/tests/regressiontests/inspectdb/tests.py
+++ b/tests/regressiontests/inspectdb/tests.py
@@ -14,3 +14,8 @@ class InspectDBTestCase(TestCase):
         self.assertNotIn("from = models.ForeignKey(InspectdbPeople)", out.getvalue(), msg=error_message)
         self.assertIn("from_field = models.ForeignKey(InspectdbPeople)", out.getvalue())
         out.close()
+
+    def test_decimal_field(self):
+        out = StringIO()
+        call_command('inspectdb', stdout=out)
+        self.assertIn("dec_field = models.DecimalField(max_digits=10, decimal_places=5)", out.getvalue())
