diff --git a/activerecord/lib/active_record/enum.rb b/activerecord/lib/active_record/enum.rb
index <HASH>..<HASH> 100644
--- a/activerecord/lib/active_record/enum.rb
+++ b/activerecord/lib/active_record/enum.rb
@@ -106,6 +106,7 @@ module ActiveRecord
       end
 
       def type_cast_from_database(value)
+        return if value.nil?
         mapping.key(value.to_i)
       end
 
diff --git a/activerecord/test/cases/enum_test.rb b/activerecord/test/cases/enum_test.rb
index <HASH>..<HASH> 100644
--- a/activerecord/test/cases/enum_test.rb
+++ b/activerecord/test/cases/enum_test.rb
@@ -168,19 +168,24 @@ class EnumTest < ActiveRecord::TestCase
     assert_equal "'unknown' is not a valid status", e.message
   end
 
+  test "NULL values from database should be casted to nil" do
+    Book.where(id: @book.id).update_all("status = NULL")
+    assert_nil @book.reload.status
+  end
+
   test "assign nil value" do
     @book.status = nil
-    assert @book.status.nil?
+    assert_nil @book.status
   end
 
   test "assign empty string value" do
     @book.status = ''
-    assert @book.status.nil?
+    assert_nil @book.status
   end
 
   test "assign long empty string value" do
     @book.status = '   '
-    assert @book.status.nil?
+    assert_nil @book.status
   end
 
   test "constant to access the mapping" do
Fixed a bug where NULLs are casted into the first enum value