diff --git a/src/optimizer/OptimizerUtils.cpp b/src/optimizer/OptimizerUtils.cpp
index 2865d55f272acefbc565cb1f628bdc8128a73609..bca8c779e2d5aead3201384cbc362398943028c2 100644
--- a/src/optimizer/OptimizerUtils.cpp
+++ b/src/optimizer/OptimizerUtils.cpp
@@ -441,7 +441,10 @@ Value OptimizerUtils::normalizeValue(const meta::cpp2::ColumnDef& col, const Val
             if (!col.type.type_length_ref().has_value()) {
                 return Value::kNullBadType;
             }
-            auto len = static_cast<size_t>(*col.get_type().type_length_ref());
+            if (!v.isStr()) {
+                return v;
+            }
+            auto len = static_cast<size_t>(*col.get_type().get_type_length());
             if (v.getStr().size() > len) {
                 return Value(v.getStr().substr(0, len));
             } else {
diff --git a/tests/tck/features/match/Base.feature b/tests/tck/features/match/Base.feature
index 5c11ece8cbe6cc9f2ff91790680ad8fc03ea9a5f..1be11df3e72ed74640bf0c1e1f1b14bb44f592c2 100644
--- a/tests/tck/features/match/Base.feature
+++ b/tests/tck/features/match/Base.feature
@@ -66,6 +66,18 @@ Feature: Basic match
       | 'Ray Allen'     | 43  |
       | 'David West'    | 38  |
       | 'Tracy McGrady' | 39  |
+    When executing query:
+      """
+      MATCH (v:player) where v.name == null RETURN v
+      """
+    Then the result should be, in any order, with relax comparison:
+      | v |
+    When executing query:
+      """
+      MATCH (v:player) where v.name == 3 RETURN v
+      """
+    Then the result should be, in any order, with relax comparison:
+      | v |
 
   Scenario: One step
     When executing query: