diff --git a/util/chunk/mutrow.go b/util/chunk/mutrow.go
index e377df54bc5b6..9bb65e4e1b484 100644
--- a/util/chunk/mutrow.go
+++ b/util/chunk/mutrow.go
@@ -144,8 +144,8 @@ func makeMutRowColumn(in interface{}) *column {
 		copy(col.data[1:], x.Value)
 		return col
 	case types.Duration:
-		col := newMutRowFixedLenColumn(16)
-		*(*types.Duration)(unsafe.Pointer(&col.data[0])) = x
+		col := newMutRowFixedLenColumn(8)
+		*(*int64)(unsafe.Pointer(&col.data[0])) = int64(x.Duration)
 		return col
 	case types.Enum:
 		col := newMutRowVarLenColumn(len(x.Name) + 8)
@@ -249,7 +249,7 @@ func (mr MutRow) SetValue(colIdx int, val interface{}) {
 	case types.BinaryLiteral:
 		setMutRowBytes(col, x)
 	case types.Duration:
-		*(*types.Duration)(unsafe.Pointer(&col.data[0])) = x
+		*(*int64)(unsafe.Pointer(&col.data[0])) = int64(x.Duration)
 	case *types.MyDecimal:
 		*(*types.MyDecimal)(unsafe.Pointer(&col.data[0])) = *x
 	case types.Time:
@@ -288,7 +288,7 @@ func (mr MutRow) SetDatum(colIdx int, d types.Datum) {
 	case types.KindMysqlTime:
 		writeTime(col.data, d.GetMysqlTime())
 	case types.KindMysqlDuration:
-		*(*types.Duration)(unsafe.Pointer(&col.data[0])) = d.GetMysqlDuration()
+		*(*int64)(unsafe.Pointer(&col.data[0])) = int64(d.GetMysqlDuration().Duration)
 	case types.KindMysqlDecimal:
 		*(*types.MyDecimal)(unsafe.Pointer(&col.data[0])) = *d.GetMysqlDecimal()
 	case types.KindMysqlJSON:
diff --git a/util/chunk/mutrow_test.go b/util/chunk/mutrow_test.go
index 1405773f027f4..e666ddcf1a5da 100644
--- a/util/chunk/mutrow_test.go
+++ b/util/chunk/mutrow_test.go
@@ -78,6 +78,17 @@ func (s *testChunkSuite) TestMutRow(c *check.C) {
 	row = mutRow.ToRow()
 	c.Assert(row.GetJSON(0), check.DeepEquals, j)
 	c.Assert(row.GetTime(1), check.DeepEquals, t)
+
+	retTypes := []*types.FieldType{types.NewFieldType(mysql.TypeDuration)}
+	chk := New(retTypes, 1, 1)
+	dur, err := types.ParseDuration(sc, "01:23:45", 0)
+	c.Assert(err, check.IsNil)
+	chk.AppendDuration(0, dur)
+	mutRow = MutRowFromTypes(retTypes)
+	mutRow.SetValue(0, dur)
+	c.Assert(chk.columns[0].data, check.BytesEquals, mutRow.c.columns[0].data)
+	mutRow.SetDatum(0, types.NewDurationDatum(dur))
+	c.Assert(chk.columns[0].data, check.BytesEquals, mutRow.c.columns[0].data)
 }
 
 func BenchmarkMutRowSetRow(b *testing.B) {