Browse Source

preselect collation utf8_general_ci by default

this should avoid the DSN param &charset=UTF8 in most cases.
Julien Schmidt 12 years ago
parent
commit
ca5611d39f
4 changed files with 14 additions and 7 deletions
  1. 0 1
      connection.go
  2. 10 0
      const.go
  3. 3 3
      driver_test.go
  4. 1 3
      packets.go

+ 0 - 1
connection.go

@@ -21,7 +21,6 @@ import (
 type mysqlConn struct {
 	cfg              *config
 	flags            clientFlag
-	charset          byte
 	cipher           []byte
 	netConn          net.Conn
 	buf              *buffer

+ 10 - 0
const.go

@@ -131,3 +131,13 @@ const (
 	flagUnknown3
 	flagUnknown4
 )
+
+const (
+	collation_ascii_general_ci   byte = 11
+	collation_utf8_general_ci    byte = 33
+	collation_utf8mb4_general_ci byte = 45
+	collation_utf8mb4_bin        byte = 46
+	collation_latin1_general_ci  byte = 48
+	collation_binary             byte = 63
+	collation_utf8mb4_unicode_ci byte = 224
+)

+ 3 - 3
driver_test.go

@@ -44,7 +44,7 @@ func init() {
 	dbname := env("MYSQL_TEST_DBNAME", "gotest")
 	charset = "charset=utf8"
 	netAddr = fmt.Sprintf("%s(%s)", prot, addr)
-	dsn = fmt.Sprintf("%s:%s@%s/%s?timeout=30s&strict=true&"+charset, user, pass, netAddr, dbname)
+	dsn = fmt.Sprintf("%s:%s@%s/%s?timeout=30s&strict=true", user, pass, netAddr, dbname)
 	c, err := net.Dial(prot, addr)
 	if err == nil {
 		available = true
@@ -103,7 +103,7 @@ func (dbt *DBTest) mustQuery(query string, args ...interface{}) (rows *sql.Rows)
 
 func TestCharset(t *testing.T) {
 	mustSetCharset := func(charsetParam, expected string) {
-		db, err := sql.Open("mysql", strings.Replace(dsn, charset, charsetParam, 1))
+		db, err := sql.Open("mysql", dsn+"&"+charsetParam)
 		if err != nil {
 			t.Fatalf("Error on Open: %v", err)
 		}
@@ -146,7 +146,7 @@ func TestFailingCharset(t *testing.T) {
 		t.Logf("MySQL-Server not running on %s. Skipping TestFailingCharset", netAddr)
 		return
 	}
-	db, err := sql.Open("mysql", strings.Replace(dsn, charset, "charset=none", 1))
+	db, err := sql.Open("mysql", dsn+"&charset=none")
 	if err != nil {
 		t.Fatalf("Error on Open: %v", err)
 	}

+ 1 - 3
packets.go

@@ -176,8 +176,6 @@ func (mc *mysqlConn) readInitPacket() (err error) {
 
 	if len(data) > pos {
 		// character set [1 byte]
-		mc.charset = data[pos]
-
 		// status flags [2 bytes]
 		// capability flags (upper 2 bytes) [2 bytes]
 		// length of auth-plugin-data [1 byte]
@@ -252,7 +250,7 @@ func (mc *mysqlConn) writeAuthPacket() error {
 	//data[11] = 0x00
 
 	// Charset [1 byte]
-	data[12] = mc.charset
+	data[12] = collation_utf8_general_ci
 
 	// SSL Connection Request Packet
 	// http://dev.mysql.com/doc/internals/en/connection-phase.html#packet-Protocol::SSLRequest