diff --git a/dialect/sql/builder.go b/dialect/sql/builder.go index 61a71d508..e7fadba36 100644 --- a/dialect/sql/builder.go +++ b/dialect/sql/builder.go @@ -1351,9 +1351,18 @@ func (p *Predicate) EqualFold(col, sub string) *Predicate { return p.Append(func(b *Builder) { f := &Func{} f.SetDialect(b.dialect) - f.Lower(col) - b.WriteString(f.String()) - b.WriteOp(OpEQ) + switch b.dialect { + case dialect.MySQL: + // We assume the CHARACTER SET is configured to utf8mb4, + // because this how it is defined in dialect/sql/schema. + b.Ident(col).WriteString(" COLLATE utf8mb4_general_ci = ") + case dialect.Postgres: + b.Ident(col).WriteString(" ILIKE ") + default: // SQLite. + f.Lower(col) + b.WriteString(f.String()) + b.WriteOp(OpEQ) + } b.Arg(strings.ToLower(sub)) }) } diff --git a/dialect/sql/builder_test.go b/dialect/sql/builder_test.go index 99f66ad6f..e81b48894 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -936,7 +936,15 @@ func TestBuilder(t *testing.T) { Select(). From(Table("users")). Where(Or(EqualFold("name", "BAR"), EqualFold("name", "BAZ"))), - wantQuery: `SELECT * FROM "users" WHERE LOWER("name") = $1 OR LOWER("name") = $2`, + wantQuery: `SELECT * FROM "users" WHERE "name" ILIKE $1 OR "name" ILIKE $2`, + wantArgs: []interface{}{"bar", "baz"}, + }, + { + input: Dialect(dialect.MySQL). + Select(). + From(Table("users")). + Where(Or(EqualFold("name", "BAR"), EqualFold("name", "BAZ"))), + wantQuery: "SELECT * FROM `users` WHERE `name` COLLATE utf8mb4_general_ci = ? OR `name` COLLATE utf8mb4_general_ci = ?", wantArgs: []interface{}{"bar", "baz"}, }, {