Skip to content

Commit eb03953

Browse files
committed
Error encoding is mixed/binary if MySQL < 5.5 and connection encoding if MySQL >= 5.5
1 parent a9787cb commit eb03953

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

ext/mysql2/client.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,21 @@ static VALUE rb_raise_mysql2_error(mysql_client_wrapper *wrapper) {
126126
VALUE rb_sql_state = rb_tainted_str_new2(mysql_sqlstate(wrapper->client));
127127
VALUE e;
128128
#ifdef HAVE_RUBY_ENCODING_H
129-
rb_encoding *default_internal_enc = rb_default_internal_encoding();
130-
rb_encoding *conn_enc = rb_to_encoding(wrapper->encoding);
131-
132-
rb_enc_associate(rb_error_msg, conn_enc);
133-
rb_enc_associate(rb_sql_state, conn_enc);
134-
if (default_internal_enc) {
135-
rb_error_msg = rb_str_export_to_enc(rb_error_msg, default_internal_enc);
136-
rb_sql_state = rb_str_export_to_enc(rb_sql_state, default_internal_enc);
129+
if (wrapper->server_version < 50500) {
130+
/* MySQL < 5.5 uses mixed encoding, just call it binary. */
131+
int err_enc = rb_ascii8bit_encindex();
132+
rb_enc_associate_index(rb_error_msg, err_enc);
133+
rb_enc_associate_index(rb_sql_state, err_enc);
134+
} else {
135+
/* MySQL >= 5.5 uses UTF-8 errors internally and converts them to the connection encoding. */
136+
rb_encoding *default_internal_enc = rb_default_internal_encoding();
137+
rb_encoding *conn_enc = rb_to_encoding(wrapper->encoding);
138+
rb_enc_associate(rb_error_msg, conn_enc);
139+
rb_enc_associate(rb_sql_state, conn_enc);
140+
if (default_internal_enc) {
141+
rb_error_msg = rb_str_export_to_enc(rb_error_msg, default_internal_enc);
142+
rb_sql_state = rb_str_export_to_enc(rb_sql_state, default_internal_enc);
143+
}
137144
}
138145
#endif
139146

@@ -219,6 +226,7 @@ static VALUE allocate(VALUE klass) {
219226
obj = Data_Make_Struct(klass, mysql_client_wrapper, rb_mysql_client_mark, rb_mysql_client_free, wrapper);
220227
wrapper->encoding = Qnil;
221228
wrapper->active_thread = Qnil;
229+
wrapper->server_version = 0;
222230
wrapper->reconnect_enabled = 0;
223231
wrapper->connected = 0; /* means that a database connection is open */
224232
wrapper->initialized = 0; /* means that that the wrapper is initialized */
@@ -311,6 +319,7 @@ static VALUE rb_connect(VALUE self, VALUE user, VALUE pass, VALUE host, VALUE po
311319
return rb_raise_mysql2_error(wrapper);
312320
}
313321

322+
wrapper->server_version = mysql_get_server_version(wrapper->client);
314323
wrapper->connected = 1;
315324
return self;
316325
}

ext/mysql2/client.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ rb_thread_call_without_gvl(
3939
typedef struct {
4040
VALUE encoding;
4141
VALUE active_thread; /* rb_thread_current() or Qnil */
42+
long server_version;
4243
int reconnect_enabled;
4344
int active;
4445
int connected;

0 commit comments

Comments
 (0)