diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 93fb2cf..6ea9372 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -1370,8 +1370,13 @@ CopyTo(CopyState cstate)
 	/* We use fe_msgbuf as a per-row buffer regardless of copy_dest */
 	cstate->fe_msgbuf = makeStringInfo();
 
-	/* Setup encoding conversion proc */
-	if (cstate->need_transcoding)
+	/*
+	 * We don't need conversion procedure when the encodings match
+	 * between target and server, but need_transcoding indicates
+	 * we need verify encoding still.
+	 */
+	if (cstate->need_transcoding &&
+		cstate->target_encoding != GetDatabaseEncoding())
 	{
 		Oid		funcoid;
 
@@ -1380,6 +1385,8 @@ CopyTo(CopyState cstate)
 		cstate->conv_proc = (FmgrInfo *) palloc(sizeof(FmgrInfo));
 		fmgr_info(funcoid, cstate->conv_proc);
 	}
+	else
+		cstate->conv_proc = NULL;
 
 	/* Get info about the columns we need to process. */
 	cstate->out_functions = (FmgrInfo *) palloc(num_phys_attrs * sizeof(FmgrInfo));
@@ -1989,8 +1996,13 @@ CopyFrom(CopyState cstate)
 	cstate->cur_attname = NULL;
 	cstate->cur_attval = NULL;
 
-	/* Setup encoding conversion proc */
-	if (cstate->need_transcoding)
+	/*
+	 * We don't need conversion procedure when the encodings match
+	 * between target and server, but need_transcoding indicates
+	 * we need verify encoding still.
+	 */
+	if (cstate->need_transcoding &&
+		cstate->target_encoding != GetDatabaseEncoding())
 	{
 		Oid		funcoid;
 
@@ -1999,6 +2011,8 @@ CopyFrom(CopyState cstate)
 		cstate->conv_proc = (FmgrInfo *) palloc(sizeof(FmgrInfo));
 		fmgr_info(funcoid, cstate->conv_proc);
 	}
+	else
+		cstate->conv_proc = NULL;
 
 	bistate = GetBulkInsertState();
 
