diff --git a/mysql-test/r/func_set.result b/mysql-test/r/func_set.result
index eeeb216d142ffbad476c0a1e0137a76e211e51cc..9181fe9e54decb0b236891d1c0aff0b4a2ce5167 100644
--- a/mysql-test/r/func_set.result
+++ b/mysql-test/r/func_set.result
@@ -28,3 +28,12 @@ find_in_set("abc","abc")	find_in_set("ab","abc")	find_in_set("abcd","abc")
 select interval(null, 1, 10, 100);
 interval(null, 1, 10, 100)
 -1
+select find_in_set(binary 'a',binary 'A,B,C');
+find_in_set(binary 'a',binary 'A,B,C')
+0
+select find_in_set('a',binary 'A,B,C');
+find_in_set('a',binary 'A,B,C')
+0
+select find_in_set(binary 'a', 'A,B,C');
+find_in_set(binary 'a', 'A,B,C')
+0
diff --git a/mysql-test/t/func_set.test b/mysql-test/t/func_set.test
index 81f561989d5cf4c5411c9953a3ed01161a6554c3..a1ee293ae05a304e79bc6d42dbfd84f1f9254cb5 100644
--- a/mysql-test/t/func_set.test
+++ b/mysql-test/t/func_set.test
@@ -16,3 +16,11 @@ select elt(2,1),field(NULL,"a","b","c");
 select find_in_set("","a,b,c"),find_in_set("","a,b,c,"),find_in_set("",",a,b,c");
 select find_in_set("abc","abc"),find_in_set("ab","abc"),find_in_set("abcd","abc");
 select interval(null, 1, 10, 100);
+
+#
+# Bug4340: find_in_set is case insensitive even on binary operators
+#
+
+select find_in_set(binary 'a',binary 'A,B,C');
+select find_in_set('a',binary 'A,B,C');
+select find_in_set(binary 'a', 'A,B,C');
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 237db890abb9e2a99cd562a738305d6d441ab727..334be48dc9a809cc038d30d40c05daeccf16807d 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1071,6 +1071,7 @@ static const char separator=',';
 
 longlong Item_func_find_in_set::val_int()
 {
+  bool binary_cmp= args[0]->binary || args[1]->binary;
   if (enum_value)
   {
     ulonglong tmp=(ulonglong) args[1]->val_int();
@@ -1103,12 +1104,25 @@ longlong Item_func_find_in_set::val_int()
     do
     {
       const char *pos= f_pos;
-      while (pos != f_end)
+      if (binary_cmp)
       {
-	if (toupper(*str) != toupper(*pos))
-	  goto not_found;
-	str++;
-	pos++;
+        while (pos != f_end)
+        {
+          if (*str != *pos)
+            goto not_found;
+          str++;
+          pos++;
+        }
+      }
+      else
+      {
+        while (pos != f_end)
+        {
+          if (toupper(*str) != toupper(*pos))
+            goto not_found;
+          str++;
+          pos++;
+        }
       }
       if (str == real_end || str[0] == separator)
 	return (longlong) position;