diff --git a/AUTHORS b/AUTHORS index 510b869b..a261819f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -37,6 +37,7 @@ Daniel Montoya Daniel Nichter Daniƫl van Eeden Dave Protasowski +Diego Dupin Dirkjan Bussink DisposaBoy Egor Smolyakov diff --git a/driver_test.go b/driver_test.go index bb8aee7e..ec0f2877 100644 --- a/driver_test.go +++ b/driver_test.go @@ -1610,10 +1610,12 @@ func TestCollation(t *testing.T) { t.Skipf("MySQL server not running on %s", netAddr) } - defaultCollation := "utf8mb4_general_ci" + // MariaDB may override collation specified by handshake with `character_set_collations` variable. + // https://mariadb.com/kb/en/setting-character-sets-and-collations/#changing-default-collation + // https://mariadb.com/kb/en/server-system-variables/#character_set_collations + // utf8mb4_general_ci, utf8mb3_general_ci will be overridden by default MariaDB. + // Collations other than charasets default are not overridden. So utf8mb4_unicode_ci is safe. testCollations := []string{ - "", // do not set - defaultCollation, // driver default "latin1_general_ci", "binary", "utf8mb4_unicode_ci", @@ -1621,57 +1623,19 @@ func TestCollation(t *testing.T) { } for _, collation := range testCollations { - var expected, tdsn string - if collation != "" { - tdsn = dsn + "&collation=" + collation - expected = collation - } else { - tdsn = dsn - expected = defaultCollation - } - - runTests(t, tdsn, func(dbt *DBTest) { - // see https://mariadb.com/kb/en/setting-character-sets-and-collations/#changing-default-collation - // when character_set_collations is set for the charset, it overrides the default collation - // so we need to check if the default collation is overridden - forceExpected := expected - var defaultCollations string - err := dbt.db.QueryRow("SELECT @@character_set_collations").Scan(&defaultCollations) - if err == nil { - // Query succeeded, need to check if we should override expected collation - collationMap := make(map[string]string) - pairs := strings.Split(defaultCollations, ",") - for _, pair := range pairs { - parts := strings.Split(pair, "=") - if len(parts) == 2 { - collationMap[parts[0]] = parts[1] - } - } + t.Run(collation, func(t *testing.T) { + tdsn := dsn + "&collation=" + collation + expected := collation - // Get charset prefix from expected collation - parts := strings.Split(expected, "_") - if len(parts) > 0 { - charset := parts[0] - if newCollation, ok := collationMap[charset]; ok { - forceExpected = newCollation - } + runTests(t, tdsn, func(dbt *DBTest) { + var got string + if err := dbt.db.QueryRow("SELECT @@collation_connection").Scan(&got); err != nil { + dbt.Fatal(err) } - } - - var got string - if err := dbt.db.QueryRow("SELECT @@collation_connection").Scan(&got); err != nil { - dbt.Fatal(err) - } - - if got != expected { - if forceExpected != expected { - if got != forceExpected { - dbt.Fatalf("expected forced connection collation %s but got %s", forceExpected, got) - } - } else { + if got != expected { dbt.Fatalf("expected connection collation %s but got %s", expected, got) } - } + }) }) } }