diff --git a/include/maxscale/mysql_utils.hh b/include/maxscale/mysql_utils.hh index b27e0d2fa..f54560fe7 100644 --- a/include/maxscale/mysql_utils.hh +++ b/include/maxscale/mysql_utils.hh @@ -114,6 +114,13 @@ mxs_mysql_name_kind_t mxs_mysql_name_to_pcre(char* pcre, */ void mxs_mysql_update_server_version(SERVER* dest, MYSQL* source); +/** + * Get default server character set + * + * @return The numeric identifier of `@@global.character_set_server` + */ +uint8_t mxs_mysql_get_character_set(MYSQL* mysql); + namespace maxscale { diff --git a/server/core/mysql_utils.cc b/server/core/mysql_utils.cc index 500624063..a1a232d19 100644 --- a/server/core/mysql_utils.cc +++ b/server/core/mysql_utils.cc @@ -84,9 +84,7 @@ MYSQL* mxs_mysql_real_connect(MYSQL* con, SERVER* server, const char* user, cons if (mysql) { /** Copy the server charset */ - MY_CHARSET_INFO cs_info; - mysql_get_character_set_info(mysql, &cs_info); - server->charset = cs_info.number; + server->charset = mxs_mysql_get_character_set(mysql); if (have_ssl && mysql_get_ssl_cipher(con) == NULL) { @@ -383,3 +381,31 @@ const char* dbg_decode_response(GWBUF* pPacket) return rv.c_str(); } #endif + +uint8_t mxs_mysql_get_character_set(MYSQL* mysql) +{ + uint8_t charset = 8; // Default is latin1 with the ID 8 + const char* CHARSET_QUERY = + "SELECT co.id FROM information_schema.collations AS co " + "JOIN information_schema.character_sets AS cs " + "ON (co.collation_name = cs.default_collate_name) " + "WHERE cs.character_set_name=@@global.character_set_server;"; + + if (mysql_query(mysql, CHARSET_QUERY) == 0) + { + if (auto res = mysql_use_result(mysql)) + { + if (auto row = mysql_fetch_row(res)) + { + if (row[0]) + { + charset = atoi(row[0]); + } + } + + mysql_free_result(res); + } + } + + return charset; +} diff --git a/server/modules/authenticator/MariaDBAuth/dbusers.cc b/server/modules/authenticator/MariaDBAuth/dbusers.cc index 8b0d33e26..bad33d484 100644 --- a/server/modules/authenticator/MariaDBAuth/dbusers.cc +++ b/server/modules/authenticator/MariaDBAuth/dbusers.cc @@ -934,9 +934,7 @@ static bool check_server_permissions(SERVICE* service, } /** Copy the server charset */ - MY_CHARSET_INFO cs_info; - mysql_get_character_set_info(mysql, &cs_info); - server->charset = cs_info.number; + server->charset = mxs_mysql_get_character_set(mysql); if (server->version().total == 0) {