diff --git a/models/issue_milestone.go b/models/issue_milestone.go
index 68a568b51a..198fa7d78c 100644
--- a/models/issue_milestone.go
+++ b/models/issue_milestone.go
@@ -6,6 +6,7 @@ package models
 
 import (
 	"fmt"
+	"strings"
 
 	"code.gitea.io/gitea/modules/setting"
 	api "code.gitea.io/gitea/modules/structs"
@@ -95,6 +96,8 @@ func NewMilestone(m *Milestone) (err error) {
 		return err
 	}
 
+	m.Name = strings.TrimSpace(m.Name)
+
 	if _, err = sess.Insert(m); err != nil {
 		return err
 	}
@@ -272,6 +275,7 @@ func GetMilestones(repoID int64, page int, isClosed bool, sortType string) (Mile
 }
 
 func updateMilestone(e Engine, m *Milestone) error {
+	m.Name = strings.TrimSpace(m.Name)
 	_, err := e.ID(m.ID).AllCols().
 		SetExpr("num_issues", builder.Select("count(*)").From("issue").Where(
 			builder.Eq{"milestone_id": m.ID},
diff --git a/models/issue_milestone_test.go b/models/issue_milestone_test.go
index 1b7999d40e..beeccdd0e4 100644
--- a/models/issue_milestone_test.go
+++ b/models/issue_milestone_test.go
@@ -158,10 +158,11 @@ func TestUpdateMilestone(t *testing.T) {
 	assert.NoError(t, PrepareTestDatabase())
 
 	milestone := AssertExistsAndLoadBean(t, &Milestone{ID: 1}).(*Milestone)
-	milestone.Name = "newMilestoneName"
+	milestone.Name = " newMilestoneName  "
 	milestone.Content = "newMilestoneContent"
 	assert.NoError(t, UpdateMilestone(milestone))
-	AssertExistsAndLoadBean(t, milestone)
+	milestone = AssertExistsAndLoadBean(t, &Milestone{ID: 1}).(*Milestone)
+	assert.EqualValues(t, "newMilestoneName", milestone.Name)
 	CheckConsistencyFor(t, &Milestone{})
 }