diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result
index d4e12ea84b70ee786b626a945ae78d10bf9384ae..665387e476cbcdd35f9cc48b7e6e1da3177035b0 100644
--- a/mysql-test/r/ctype_utf8.result
+++ b/mysql-test/r/ctype_utf8.result
@@ -939,6 +939,17 @@ content	msisdn
 ERR 袠屑褉懈.袗褎懈屑懈屑.袗械懈屑懈屑褉懈屑写屑褉懈屑褉屑褉懈褉芯褉 懈屑褉懈屑褉懈屑褉懈屑褉 懈屑褉懈写屑 懈褉斜写薪褉懈屑褉褎屑褉懈褉懈褉懈屑褉褎屑褎屑懈屑.袗写.袛 懈屑写懈屑褉懈屑褉邪写.袗写懈屑褉懈屑褉懈屑褉屑写懈褉懈屑褉懈屑褉懈屑褉 屑.袛邪写懈屑褎褕褜屑褉懈屑写 懈屑.袗写懈屑懈屑褉薪 懈屑邪写屑懈	1234567890
 11 g	1234567890
 DROP TABLE t1,t2;
+create table t1 (a char(20) character set utf8);
+insert into t1 values ('123456'),('邪薪写褉械泄');
+alter table t1 modify a char(2) character set utf8;
+Warnings:
+Warning	1265	Data truncated for column 'a' at row 1
+Warning	1265	Data truncated for column 'a' at row 2
+select char_length(a), length(a), a from t1 order by a;
+char_length(a)	length(a)	a
+2	2	12
+2	4	邪薪
+drop table t1;
 CREATE TABLE t1 (
 a varchar(255) NOT NULL default '',
 KEY a (a)
diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test
index 0a8470572589e22419710a4696d4cbf691e2eeb5..737dcbcf1edec21a740bdd41e8337ce26040c1a3 100644
--- a/mysql-test/t/ctype_utf8.test
+++ b/mysql-test/t/ctype_utf8.test
@@ -789,6 +789,16 @@ SELECT content, t2.msisdn FROM t1, t2 WHERE t1.msisdn = '1234567890';
 
 DROP TABLE t1,t2;
 
+#
+# Bug#11591: CHAR column with utf8 does not work properly
+# (more chars than expected)
+#
+create table t1 (a char(20) character set utf8);
+insert into t1 values ('123456'),('邪薪写褉械泄');
+alter table t1 modify a char(2) character set utf8;
+select char_length(a), length(a), a from t1 order by a;
+drop table t1;
+
 #
 # Bug#9557 MyISAM utf8 table crash
 #
diff --git a/sql/field_conv.cc b/sql/field_conv.cc
index 8b362bbf80718a9990eea988def4da86559febcc..625586d8c9b176a3b4486ac93cfe61eebece6c46 100644
--- a/sql/field_conv.cc
+++ b/sql/field_conv.cc
@@ -326,21 +326,28 @@ static void do_field_real(Copy_field *copy)
 
 static void do_cut_string(Copy_field *copy)
 {						// Shorter string field
-  memcpy(copy->to_ptr,copy->from_ptr,copy->to_length);
-
-  /* Check if we loosed any important characters */
-  char *ptr,*end;
-  for (ptr=copy->from_ptr+copy->to_length,end=copy->from_ptr+copy->from_length ;
-       ptr != end ;
-       ptr++)
+  int well_formed_error;
+  CHARSET_INFO *cs= copy->from_field->charset();
+  const char *from_end= copy->from_ptr + copy->from_length;
+  uint copy_length= cs->cset->well_formed_len(cs, copy->from_ptr, from_end, 
+                                              copy->to_length / cs->mbmaxlen,
+                                              &well_formed_error);
+  if (copy->to_length < copy_length)
+    copy_length= copy->to_length;
+  memcpy(copy->to_ptr, copy->from_ptr, copy_length);
+
+  /* Check if we lost any important characters */
+  if (well_formed_error ||
+      cs->cset->scan(cs, copy->from_ptr + copy_length, from_end,
+                     MY_SEQ_SPACES) < (copy->from_length - copy_length))
   {
-    if (!my_isspace(system_charset_info, *ptr))	// QQ: ucs incompatible
-    {
-      copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
-                                  ER_WARN_DATA_TRUNCATED, 1);
-      break;
-    }
+    copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
+                                ER_WARN_DATA_TRUNCATED, 1);
   }
+
+  if (copy_length < copy->to_length)
+    cs->cset->fill(cs, copy->to_ptr + copy_length,
+                       copy->to_length - copy_length, ' ');
 }