diff --git a/src/box/tuple_compare.cc b/src/box/tuple_compare.cc
index 8fd4a001cb425c8ee1e1e22832399c61666ff677..8e11ac5a8edc878732c19efe21f231c8e639c7a1 100644
--- a/src/box/tuple_compare.cc
+++ b/src/box/tuple_compare.cc
@@ -345,6 +345,17 @@ mp_compare_scalar(const char *field_a, const char *field_b)
 					   field_b, mp_typeof(*field_b));
 }
 
+static inline int
+mp_compare_scalar_coll(const char *field_a, const char *field_b,
+		       struct coll *coll)
+{
+	enum mp_type type_a = mp_typeof(*field_a);
+	enum mp_type type_b = mp_typeof(*field_b);
+	if (type_a == MP_STR && type_b == MP_STR)
+		return mp_compare_str_coll(field_a, field_b, coll);
+	return mp_compare_scalar_with_hint(field_a, type_a, field_b, type_b);
+}
+
 /**
  * @brief Compare two fields parts using a type definition
  * @param field_a field
@@ -375,7 +386,9 @@ tuple_compare_field(const char *field_a, const char *field_b,
 	case FIELD_TYPE_BOOLEAN:
 		return mp_compare_bool(field_a, field_b);
 	case FIELD_TYPE_SCALAR:
-		return mp_compare_scalar(field_a, field_b);
+		return coll != NULL ?
+		       mp_compare_scalar_coll(field_a, field_b, coll) :
+		       mp_compare_scalar(field_a, field_b);
 	default:
 		unreachable();
 		return 0;
@@ -401,7 +414,9 @@ tuple_compare_field_with_hint(const char *field_a, enum mp_type a_type,
 		return mp_compare_number_with_hint(field_a, a_type,
 						   field_b, b_type);
 	case FIELD_TYPE_SCALAR:
-		return mp_compare_scalar_with_hint(field_a, a_type,
+		return coll != NULL ?
+		       mp_compare_scalar_coll(field_a, field_b, coll) :
+		       mp_compare_scalar_with_hint(field_a, a_type,
 						   field_b, b_type);
 	default:
 		unreachable();
diff --git a/test/box/misc.result b/test/box/misc.result
index 29034ca79a0922b1cd961ead12cee1678f9a7b74..000f4aa31bdc5ab246895ac5450e35cd3f1afeec 100644
--- a/test/box/misc.result
+++ b/test/box/misc.result
@@ -1033,3 +1033,40 @@ s:create_index('test5', {parts = {{5, 'string', collation = 'Unicode'}}}).parts
 s:drop()
 ---
 ...
+s = box.schema.space.create('test')
+---
+...
+not not s:create_index('test1', {parts = {{1, 'scalar', collation = 'unicode_s1'}}})
+---
+- true
+...
+s:replace{1} s:replace{1.1} s:replace{false}
+---
+...
+s:replace{'Блин'} s:replace{'Ёж'} s:replace{'ешь'} s:replace{'Же'} s:replace{'Уже'}
+---
+...
+s:replace{'drop'} s:replace{'table'} s:replace{'users'}
+---
+...
+s:select{}
+---
+- - [false]
+  - [1]
+  - [1.1]
+  - ['drop']
+  - ['table']
+  - ['users']
+  - ['Блин']
+  - ['Ёж']
+  - ['ешь']
+  - ['Же']
+  - ['Уже']
+...
+s:select{'еж'}
+---
+- - ['Ёж']
+...
+s:drop()
+---
+...
diff --git a/test/box/misc.test.lua b/test/box/misc.test.lua
index 2235c99cd972f0da1594ece2a0777ab5cee25266..cac688d499e0a9bd9566cdfb874e21f563a1c8e9 100644
--- a/test/box/misc.test.lua
+++ b/test/box/misc.test.lua
@@ -281,3 +281,12 @@ not not s:create_index('test3', {parts = {{3, 'string', collation = 'UnIcOdE'}}}
 s:create_index('test4', {parts = {{4, 'string'}}}).parts
 s:create_index('test5', {parts = {{5, 'string', collation = 'Unicode'}}}).parts
 s:drop()
+
+s = box.schema.space.create('test')
+not not s:create_index('test1', {parts = {{1, 'scalar', collation = 'unicode_s1'}}})
+s:replace{1} s:replace{1.1} s:replace{false}
+s:replace{'Блин'} s:replace{'Ёж'} s:replace{'ешь'} s:replace{'Же'} s:replace{'Уже'}
+s:replace{'drop'} s:replace{'table'} s:replace{'users'}
+s:select{}
+s:select{'еж'}
+s:drop()